如何在Spark reduceByKey中展平列表

时间:2017-10-14 19:57:09

标签: pyspark

我正在尝试简化以下代码:

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()

1 个答案:

答案 0 :(得分:1)

您可以使用groupByKey

k.groupByKey().mapValues(lambda x: list(x)).collect()
# [(3, ['dog', 'cat', 'ant'])]

您似乎将reduceByKeyfold方法混淆,后者接受初始值。

reduceByKey

  

它接受交换和关联函数作为参数:

     
      
  • 参数函数应该有两个相同数据类型的参数
  •   
  • 函数的返回类型也必须与参数类型
  • 相同   

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'])]