首页 > 解决方案 > 根据列表的匹配值将常见行过滤到 Spark DataFrame 中

问题描述

dfA我必须在两个名为and的 DataFrame 之间找到对应的行dfB

dfA.show()
+---+-----+-------+
| id| name|address|
+---+-----+-------+
|  1| AAAA|  Paris|
|  4| DDDD| Sydney|
+---+-----+-------+

dfB.show()
+---+-----+-------+
| id| name|address|
+---+-----+-------+
|  1| AAAA|  Paris|
|  2| BBBB|NewYork|
|  3| CCCC| London|
|  4| DDDD| Sydney|
+---+-----+-------+

我使用如下构造的值列表:

val array = dfA
  .select("id")
  .map(r =>{r.getString(0)})
  .collect()

array Output:
1
2

为了在两个 DataFrame 之间有对应的值:

val dfFilter = dfB.filter(dfB.col("id").isInCollection(array))
  .select("id")

dfFilter.show()
+---+
| id|
+---+
|  1|
|  4|
+---+

如果仅使用一个名为id用于搜索的列,则此代码可以正常工作。

我的问题是如何使用和之间的几列( id, name, address)对常见行进行这项研究?dfAdfB

标签: scalaapache-spark

解决方案


你可以做一个半连接。只需将任意数量的列放入Seq您希望用于过滤的列中。

val result = dfA.join(dfB, Seq("id", "name", "address"), "left_semi")

推荐阅读