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

时间:2017-10-28 08:10:50

标签: java arrays apache-spark spark-dataframe

我有2个数据帧df1和df2。 df1有1个String

类型的列键
df1.show()

key
----
k1
k2
k3

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

我想在df2.keys中存在df1.key时加入2个数据帧。我在此处看到了先前的例子Spark: Join dataframe column with an array

然而,我正在寻找一个完整的单词匹配。 Contains方法正在连接具有部分匹配的行。我的意思是在上面的例子中,我不希望k2与[pk1,pk2]连接,因为数组不包含密钥k2,它包含pk2。

有人可以建议如何加入这种情况吗? 请在JAVA中提供示例。

2 个答案:

答案 0 :(得分:2)

功能" 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]|
+---+-----+--------+

答案 1 :(得分: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|
+-----+--------+---+---+

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