python - PySpark 计数 groupby 与 None 键
问题描述
我有一个火花 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,但我不知道如何摆脱它们。
任何想法如何继续调查?PS toDF() 也失败了,我想是由于同样的原因。另外,我会为 RDD 而不是 DataFrame 提供解决方案。谢谢
解决方案
您需要提供元组 reduceByKey。看起来你只是忘记了'()'
myRDD.map(lambda x: (x.type, 1)).reduceByKey(lambda x, y: x + y).collect()
旁注:与 countByKey() 相同的代码的较短版本
myRDD.map(lambda x: (x.type,)).countByKey()
推荐阅读
- z3 - 有没有办法将输入作为正常表达式提供给 Z3 Solver?
- .net-core-2.2 - 有没有办法根据使用的 http 动词有条件地验证模型?
- sed - sed输出变成sed输入?
- ios - Adaptive Cards iOS - 如何在卡片边缘添加填充?
- ios - queryStarting(atValue 没有按预期工作?
- ruby - 这个 Ruby PSQL 对注入安全吗?
- flask - 在 Flask 中最有效地利用蓝图?
- python - 如何处理不使用 3XX 状态码的重定向?
- c# - 如何验证一个页面上的文本,然后使用 Selenium C# 验证它是另一个页面上的相同文本?
- c++ - 如何用触摸数据模拟鼠标点击?