Java Spark数据帧连接列包含数组



我有 2 个数据帧 df1 和 df2。 df1 有 1 个字符串类型的列键

df1.show().key----K1K2K3DF2 有 2 列df2.show()主题 |钥匙------------- T1 |[K1, K2] T2 |[PK1, pk2]

当 df1.key 存在于 df2.keys 中时,我想加入 2 个数据帧。我在这里看到了以前发布的示例 Spark:使用数组联接数据帧列

但是,我正在寻找一个完整的单词匹配。包含方法正在联接具有部分匹配的行。我的意思是在上面的例子中,我不希望 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|
+-----+--------+---+---+

请注意,它不是很有效,因为它会复制数据。

相关内容

  • 没有找到相关文章

最新更新