scala - 根据列表的匹配值将常见行过滤到 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
)对常见行进行这项研究?dfA
dfB
解决方案
你可以做一个半连接。只需将任意数量的列放入Seq
您希望用于过滤的列中。
val result = dfA.join(dfB, Seq("id", "name", "address"), "left_semi")