Java 包含数组的 spark dataframe 连接列
Java spark dataframe join column containing array
我有 2 个数据帧 df1 和 df2。 df1 有 1 个字符串类型的列键
df1.show()
钥匙
----
k1
k2
k3
df2 有 2 列
df2.show()
话题 |钥匙
--------------
t1 | [k1, k2]
t2 | [pk1, pk2]
当 df1.key 出现在 df2.keys 中时,我想加入 2 个数据帧。我在此处看到以前发布的示例
但是,我正在寻找一个完整的单词匹配项。 Contains 方法正在连接具有部分匹配项的行。我的意思是在上面的例子中,我不希望 k2 与 [pk1, pk2] 连接,因为数组不包含键 k2,它包含 pk2.
有人可以建议在这种情况下如何加入吗?
请在 JAVA.
中提供示例
你可以做的是分解你的数组并像这样每个键一行:
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|
+-----+--------+---+---+
请注意,它不是很有效,因为它会重复数据。
函数"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]|
+---+-----+--------+
我有 2 个数据帧 df1 和 df2。 df1 有 1 个字符串类型的列键
df1.show() 钥匙 ---- k1 k2 k3 df2 有 2 列 df2.show() 话题 |钥匙 -------------- t1 | [k1, k2] t2 | [pk1, pk2]
当 df1.key 出现在 df2.keys 中时,我想加入 2 个数据帧。我在此处看到以前发布的示例
但是,我正在寻找一个完整的单词匹配项。 Contains 方法正在连接具有部分匹配项的行。我的意思是在上面的例子中,我不希望 k2 与 [pk1, pk2] 连接,因为数组不包含键 k2,它包含 pk2.
有人可以建议在这种情况下如何加入吗? 请在 JAVA.
中提供示例你可以做的是分解你的数组并像这样每个键一行:
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|
+-----+--------+---+---+
请注意,它不是很有效,因为它会重复数据。
函数"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]|
+---+-----+--------+