我正在尝试简化以下代码:
k=sc.parallelize(["dog", "cat", 'ant']).map(lambda x: (len(x),x))
k.reduceByKey(lambda acc,x: [acc,x]).collect()
我不清楚为什么以下失败
k.reduceByKey(lambda acc,x: [x] if acc == None else acc.append(x) ).collect()
答案 0 :(得分:1)
您可以使用groupByKey
:
k.groupByKey().mapValues(lambda x: list(x)).collect()
# [(3, ['dog', 'cat', 'ant'])]
您似乎将reduceByKey
与fold
方法混淆,后者接受初始值。
它接受交换和关联函数作为参数:
- 参数函数应该有两个相同数据类型的参数
- 函数的返回类型也必须与参数类型
相同
在 lambda 函数中,acc.append(x)
例如返回None。
因此,如果使用reduceByKey
,您可以执行以下操作:
k.reduceByKey(lambda a, b: (a if isinstance(a, list) else [a]) + (b if isinstance(b, list) else [b])).collect()
# [(3, ['dog', 'cat', 'ant'])]