在 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 数据框中找到两列的余弦相似度?