python - CombineByKey 适用于 pyspark python 2 但不适用于 python 3
问题描述
以下适用于使用 python2 的 pyspark:
data = [
('A', 2.), ('A', 4.), ('A', 9.),
('B', 10.), ('B', 20.),
('Z', 3.), ('Z', 5.), ('Z', 8.), ('Z', 12.)
]
rdd = sc.parallelize( data )
sumCount = rdd.combineByKey(lambda value: (value, 1),
lambda x, value: (x[0] + value, x[1] + 1),
lambda x, y: (x[0] + y[0], x[1] + y[1])
)
averageByKey = sumCount.map(lambda (key, (totalSum, count)): (key, totalSum / count))
averageByKey.collectAsMap()
该行:
averageByKey = sumCount.map(lambda (key, (totalSum, count)): (key, totalSum / count))
在 python3 下返回:
SyntaxError: invalid syntax
File "<command-2372155099811162>", line 14
averageByKey = sumCount.map(lambda (key, (totalSum, count)): (key, totalSum / count))
找不到什么 python3 更改导致这个和替代。
解决方案
pyspark 中使用 python3 的以下代码有效:
data = sc.parallelize( [(0, 2.), (0, 4.), (1, 0.), (1, 10.), (1, 20.)] )
sumCount = data.combineByKey(lambda value: (value, 1),
lambda x, value: (x[0] + value, x[1] + 1),
lambda x, y: (x[0] + y[0], x[1] + y[1]))
averageByKey = sumCount.map(lambda label_value_sum_count: (label_value_sum_count[0], label_value_sum_count[1][0] / label_value_sum_count[1][1]))
print(averageByKey.collectAsMap())
正确返回:
{0: 3.0, 1: 10.0}
python2 和 python3 有一些差异,SO 上的很多东西都是 python2。
推荐阅读
- java - 升级到 Java 8 会导致单元测试中的 Orika 映射器 java.io.IOException: invalid constant type: 15 at 142
- javascript - safari input type='number' 无法显示真实值
- javascript - 当数据更改时,饼图中的切片大小保持不变(版本=本帖的当前版本)
- python-2.7 - 我如何使 Tkinker 小部件忽略其上方行中小部件的宽度(并且只是浮动到左侧)?
- ssis - 在 SSIS 中计算给定日期的每周倒计时
- java - 如何在所有 apache 请求中保留原始 IP 地址
- javascript - 如何搜索邮政编码和城市谷歌地图
- sql - Arel 连接子查询
- javascript - 如何使用 javascript 在 JSON 文件中编写单个反斜杠?
- python - 将多索引/多级数据帧减少为单索引、单级