包含数组的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]|
+---+-----+--------+
答
你可以做的是爆炸阵列,并且获得每个键一行这样的:
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(列表
完美!这对我来说也适用于Java!谢谢 !! – kamnemm