2017-10-28 16 views
1

私は2つのデータフレームdf1とdf2を持っています。 DF1は、String型df1.keyがdf2.keys中に存在しているとき、私は2つのデータフレームに参加したい配列を含むJavaスパークデータフレーム結合列

 
df1.show() 

key 
---- 
k1 
k2 
k3 

df2 has 2 columns 
df2.show() 
topic | keys 
------------- 
t1 | [k1, k2] 
t2 | [pk1, pk2] 

の1列のキーを持っています。前の例がここに掲載されていたのを見たSpark: Join dataframe column with an array

しかし、私は完全な単語の一致を探しています。メソッドを含むメソッドは、部分的に一致する行を結合しています。上記の例では、配列にキーk2が含まれていないため、[pk1、pk2]とk2を結合したくないということです.pk2が含まれています。

誰かがこの場合に参加する方法を提案できますか? JAVAで例を挙げてください。あなたは何ができるか

答えて

0

機能 "array_contains" を使用することができます。

val df1 = List("k1", "k2", "k3").toDF("key") 
val df2 = List(
    ("t1", Array("k1", "k2")), 
    ("t2", Array("pk1", "pk2")) 
).toDF("topic", "keys") 
val result = df1.join(df2, expr("array_contains(keys,key)")) 
result.show(false) 

出力:

+---+-----+--------+ 
|key|topic|keys | 
+---+-----+--------+ 
|k1 |t1 |[k1, k2]| 
|k2 |t1 |[k1, k2]| 
+---+-----+--------+ 
+0

パーフェクト!これはJavaの私のためにも働く!ありがとう!! – kamnemm

0

があなたの配列を爆発し、そのようにキーごとに1行を取得している:それはとてもではないことを

Dataset<Row> result = df2.join(key, df2.col("key").equalTo(df1.col("key")), "inner") 
result.show() 

+-----+--------+---+---+ 
|topic| keys|key|key| 
+-----+--------+---+---+ 
| t1|[k1, k2]| k1| k1| 
| t1|[k1, k2]| k2| k2| 
+-----+--------+---+---+ 

注:

df2 = df2.withColumn("key", explode(df2.col("keys"))) 
df2.show() 

+-----+----------+---+ 
|topic|  keys|key| 
+-----+----------+---+ 
| t1| [k1, k2]| k1| 
| t1| [k1, k2]| k2| 
| t2|[pk1, pk2]|pk1| 
| t2|[pk1, pk2]|pk2| 
+-----+----------+---+ 

その後、あなたは、この新しい列に参加することができますそれはデータを複製するので効率的です。

+0

をうん、私は約爆発すると思いました。しかし、より良い選択肢がありますか?ジョインはUDF(List 、String)のようなものをとり、ジョイン条件として使用できるDataType.Booleanを返しますか? – kamnemm

関連する問題