2017-08-01 20 views
1

を取得するには、別のデータフレームにおける配列値を1つのデータフレームに配列の値を比較Iは、次の2つのデータフレームを持っている:PySpark:交差点

l1 = [(['hello','world'],), (['stack','overflow'],), (['hello', 'alice'],), (['sample', 'text'],)] 
df1 = spark.createDataFrame(l1) 

l2 = [(['big','world'],), (['sample','overflow', 'alice', 'text', 'bob'],), (['hello', 'sample'],)] 
df2 = spark.createDataFrame(l2) 

がDF1:

["hello","world"] 
["stack","overflow"] 
["hello","alice"] 
["sample","text"] 

DF2:

["big","world"] 
["sample","overflow","alice","text","bob"] 
["hello", "sample"] 

df1のすべての行について、配列内のすべての単語がdf2で出現する回数を計算したい。

たとえば、df1の最初の行は["hello","world"]です。ここでは、["hello","world"]とdf2のすべての行との交差点についてdf2をチェックしたいと思います。

|     ARRAY     | INTERSECTION | LEN(INTERSECTION)| 
|["big","world"]       |["world"]  | 1    | 
|["sample","overflow","alice","text","bob"] |[]   | 0    | 
|["hello","sample"]       |["hello"]  | 1    | 

ここでは、sum(len(interesection))を返信します。最終的に私は結果DF1は次のようになりたい:

DF1結果:

 ARRAY    INTERSECTION_TOTAL 
| ["hello","world"] |  2     | 
| ["stack","overflow"] |  1     | 
| ["hello","alice"] |  2     | 
| ["sample","text"] |  3     | 

がどのように私はこの問題を解決するのですか?

答えて

1

最初にデカルト製品を避けることに焦点を当てます。

df1_.join(df2_, "word").groupBy("words").count().show() 
+-----------------+-----+              
|   words|count| 
+-----------------+-----+ 
| [hello, alice]| 2| 
| [sample, text]| 3| 
|[stack, overflow]| 1| 
| [hello, world]| 2| 
+-----------------+-----+ 

、あなたがidを追加省くことができます:私は、中間値はそれが簡略化される可能性が必要とされていない場合は爆発し

from pyspark.sql.functions import explode, monotonically_increasing_id 

df1_ = (df1.toDF("words") 
    .withColumn("id_1", monotonically_increasing_id()) 
    .select("*", explode("words").alias("word"))) 

df2_ = (df2.toDF("words") 
    .withColumn("id_2", monotonically_increasing_id()) 
    .select("id_2", explode("words").alias("word"))) 

(df1_.join(df2_, "word").groupBy("id_1", "id_2", "words").count() 
    .groupBy("id_1", "words").sum("count").drop("id_1").show()) 
+-----------------+----------+             
|   words|sum(count)| 
+-----------------+----------+ 
| [hello, alice]|   2| 
| [sample, text]|   3| 
|[stack, overflow]|   1| 
| [hello, world]|   2| 
+-----------------+----------+ 

に参加しようと思います。