2017-10-28 99 views
1

我有2個數據框df1和df2。 df1有1個字符串類型的列鍵包含數組的Java spark數據框連接列

 
df1.show() 

key 
---- 
k1 
k2 
k3 

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

我想在df2.key中存在df1.key時加入2個數據幀。我看到以前的例子發佈在這裏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

你可以做的是爆炸陣列,並且獲得每個鍵一行這樣的:

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| 
+-----+----------+---+ 

然後你就可以加入這個新列:

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| 
+-----+--------+---+---+ 

注意它是不是很因爲它複製數據,所以效率很高。

+0

呀,我想到了爆炸。但有沒有更好的選擇?可以加入UDF(列表,字符串)並返回可用作連接條件的DataType.Boolean? – kamnemm

相關問題