Pyspark - 在作为列表的 spark 数据框列上使用 reducebykey

Posted

技术标签:

【中文标题】Pyspark - 在作为列表的 spark 数据框列上使用 reducebykey【英文标题】:Pyspark - Using reducebykey on spark dataframe column that is lists 【发布时间】:2017-06-06 13:51:13 【问题描述】:

所以我有一个名为 ngram_df 的 spark 数据框,看起来像这样

--------------------------------
 Name   | nGrams               |
--------|--------------------- |  
 Alice  | [ALI, LIC, ICE]      |
 Alicia | [ALI, LIC, ICI, CIA] |
--------------------------------

我想以字典形式生成输出,例如:

ALI:2,LIC:2,ICE:1,ICI:1,CIA:1

我一直在尝试将 nGrams 列转换为 RDD,以便我可以使用 reduceByKey 函数

rdd = ngram_df.map(lambda row: row['nGrams'])
test = rdd.reduceByKey(add).collect()

但是我得到了错误:

ValueError:解包的值太多

即使使用 flatmap 也无济于事,因为我得到了错误:

ValueError: 需要超过 1 个值才能解压

【问题讨论】:

【参考方案1】:

这可以通过 flatMap 和 reduceByKey 方法的组合来实现。

rdd = spark.sparkContext.parallelize([('Alice', ['ALI', 'LIC', 'ICE']), ('Alicia', ['ALI', 'LIC', 'ICI', 'CIA'])])

result = rdd.flatMap(lambda x: [(y, 1) for y in x[1]] ).reduceByKey(lambda x,y: x+y)

result.collect()
[('ICI', 1), ('CIA', 1), ('ALI', 2), ('ICE', 1), ('LIC', 2)]

【讨论】:

以上是关于Pyspark - 在作为列表的 spark 数据框列上使用 reducebykey的主要内容,如果未能解决你的问题,请参考以下文章

pyspark 从 spark 数据框列创建一个不同的列表并在 spark sql where 语句中使用

数据框列中的嵌套列表,提取数据框列中列表的值 Pyspark Spark

使 Spark 结构化流中的 JSON 可以在 python (pyspark) 中作为没有 RDD 的数据帧访问

PySpark:Spark数据框-将ImageSchema列转换为nDArray作为新列

如何在 pyspark 中对 spark 数据框中的多列求和?

如何在 pyspark 中对 spark 数据框中的多列求和?