【问题标题】:Filtering common rows into a Spark DataFrame based on matching values of a list根据列表的匹配值将常见行过滤到 Spark DataFrame 中
【发布时间】:2021-04-20 21:34:25
【问题描述】:

我必须在两个名为 dfAdfB 的 DataFrame 之间找到对应的行:

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

为了让两个DataFrames之间有对应的值:

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

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

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

我的问题是如何在dfAdfB 之间使用几列(idnameaddress)对常见行进行这项研究?

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    您可以进行半连接。只需在 Seq 中添加您希望用于过滤的任意数量的列。

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

    【讨论】:

    • 感谢您的回复!除了加入之外还有其他方法吗,因为在我的情况下它表现不佳
    • 如果dfB足够小,你可以广播
    • 表现不佳是什么意思?您的数据规模和运行时间是多少?
    猜你喜欢
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2017-03-10
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    相关资源
    最近更新 更多