PySpark 计数 groupby 与 None 键

Posted

技术标签:

【中文标题】PySpark 计数 groupby 与 None 键【英文标题】:PySpark count groupby with None keys 【发布时间】:2020-11-16 11:47:29 【问题描述】:

我有一个 spark RDD 对象(使用 pyspark),我正在尝试获得相当于 SQL 的对象

SELECT MY_FIELD COUNT(*) GROUP BY MY_FIELD

所以我尝试了以下代码:

my_groupby_count = myRDD.map(lambda x: x.type).reduceByKey(lambda x, y: x + y).collect()
# 'type' is the name of the field inside the RDD row

但是我得到了一个错误,我不确定如何处理:

---------------------------------------------------------------------------
Py4JJavaError                             Traceback (most recent call last)
<ipython-input-24-23b4c60c6fd6> in <module>()
----> 1 my_groupby_count = myRDD.map(lambda x: x.type).reduceByKey(lambda x, y: x +     y).collect()

/root/spark/python/pyspark/rdd.py in collect(self)
         
         with SCCallSiteSync(self.context) as css:
-->              port = self.ctx._jvm.PythonRDD.collectAndServe(self._jrdd.rdd())
         return list(_load_from_socket(port, self._jrdd_deserializer))
 
/root/spark/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py in __call__(self, *args)
         answer = self.gateway_client.send_command(command)
         return_value = get_return_value(
->              answer, self.gateway_client, self.target_id, self.name)

现在,由于这种方法以前对我很有效,我怀疑它可能与数据本身有关。例如,我知道 x.type 中的某些值是 None,但我不知道如何摆脱它们。

任何想法如何继续调查? 附: toDF() 也失败了,我想是由于同样的原因。 另外,我会为 RDD 而不是 DataFrame 提供解决方案。 谢谢

【问题讨论】:

没有。这是我发布的同一个问题。由于沟通问题,它被发布了两次 【参考方案1】:

你需要提供元组reduceByKey。看起来你只是忘记了'()'

myRDD.map(lambda x: (x.type, 1)).reduceByKey(lambda x, y: x + y).collect()

旁注:与 countByKey() 相同的代码的较短版本

myRDD.map(lambda x: (x.type,)).countByKey()

【讨论】:

谢谢,这是一个更好的方法。无论如何,为了将来参考,代码没有任何问题。重启环境解决了一切

以上是关于PySpark 计数 groupby 与 None 键的主要内容,如果未能解决你的问题,请参考以下文章

检查一列是不是与pyspark中的groupby连续

与 groupBy 聚合后将 pyspark 数据帧保存为 csv 文件

如何使用 groupby 和聚合将 pyspark 数据框中的行与多列连接起来

pyspark groupby 并应用自定义函数

LINQ 与 groupby 和计数

GroupBy 每周在熊猫中与其他列一起计数