包含数组的Java spark数据框连接列

问题描述:

我有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中提供示例。

功能 “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

你可以做的是爆炸阵列,并且获得每个键一行这样的:

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