在 pyspark 中比较不同数据框中的两列,分别为 String 和 Array<string> 类型

Posted

技术标签:

【中文标题】在 pyspark 中比较不同数据框中的两列,分别为 String 和 Array<string> 类型【英文标题】:Compare two columns in different dataframes, of types String and Array<string> respectively in pyspark 【发布时间】:2020-09-29 08:01:24 【问题描述】:

有两个 DF:

df1:

Word Count
abd    1
abc    2
ad     3

df2:

words,     CountSum
[ad,as,abd] 0
[abc,ad]    0

等等。

我的主要目标是遍历 df2 的单词列中的每个“值”,将其与 df1 中的“单词”列匹配。

如果找到匹配项 - 将 df1 计数添加到 df2 CountSum。

例如。以上,

在 df2 - [abd,ad] 在 df1.word ---> 所以 CountSum=count(ad)+count(abd) = 4 等等

现在,DF2 决赛:

words  CountSum
[ad,as,abd] 4
[abc,ad]    5

到目前为止,我有一个大致的想法,即我需要加入 DF 并分解数组以获得所需的结果,但已经充满了类型不匹配和列不可迭代的错误。

此外,这可以通过 pyspark 中的内置方法完成,还是我必须使用 UDF?

提前致谢。

【问题讨论】:

CountSum 开头总是 0 ? 是的,;这是一个依赖于过滤器的派生字段。因此,如果没有匹配的单词,sum 将为 0。任何其他建议都会有所帮助。 【参考方案1】:

我会做这样的事情:

from pyspark.sql import functions as F

df2.withColumn("word", F.explode("words")).join(df, how="left", on="word").groupBy(
    "words"
).agg(F.sum("count").alias("CountSum")).show()

+-------------+--------+
|        words|CountSum|
+-------------+--------+
|[ad, as, abd]|       4|
|    [abc, ad]|       5|
+-------------+--------+

【讨论】:

这似乎是我一直在寻找的答案。谢谢你的回答。一般情况下是否可以使用 pandas UDF/UDF 来做到这一点?子问题:“爆炸并加入 group by”vs UDF?百万行以上的最佳选择是什么? 内置一般比UDF好。在我的解决方案中,您有一个 equi join,这是进行连接的好方法,这是任何 UDF 都没有的。

以上是关于在 pyspark 中比较不同数据框中的两列,分别为 String 和 Array<string> 类型的主要内容,如果未能解决你的问题,请参考以下文章

如何比较数据框中的两列,检查它们之前是不是存在?

在 PySpark 的两个不同 pyspark.sql.dataframes 中的两列中创建一个 pyspark.sql.dataframe

PYSPARK:如何在 pyspark 数据框中找到两列的余弦相似度?

如何基于每个数据框中具有不同名称的两列将两个数据框与 dplyr 连接起来? [复制]

试图在r中隔离数据框中的两列[重复]

使用 PySpark 连接与另一列中的两列确定的范围相匹配的数据框