映射和ReduceByKey
输入类型和输出类型reduce
必须相同,因此如果你想聚合一个列表,你必须map
列表的输入。然后,您将这些列表合并为一个列表。
组合列表
您需要一种将列表合并为一个列表的方法。 Python提供了一些组合列表的方法.
append
修改第一个列表并且总是返回None
.
x = [1, 2, 3]
x.append([4, 5])
# x is [1, 2, 3, [4, 5]]
extend
做同样的事情,但解开列表:
x = [1, 2, 3]
x.extend([4, 5])
# x is [1, 2, 3, 4, 5]
两种方法都返回None
,但是您需要一个返回组合列表的方法,因此只需使用加号.
x = [1, 2, 3] + [4, 5]
# x is [1, 2, 3, 4, 5]
Spark
file = spark.textFile("hdfs://...")
counts = file.flatMap(lambda line: line.split(" ")) \
.map(lambda actor: (actor.split(",")[0], actor)) \
# transform each value into a list
.map(lambda nameTuple: (nameTuple[0], [ nameTuple[1] ])) \
# combine lists: ([1,2,3] + [4,5]) becomes [1,2,3,4,5]
.reduceByKey(lambda a, b: a + b)
按键组合
也可以用以下方法解决这个问题combineByKey
,它在内部用于实现reduceByKey
,但它更复杂并且“使用 Spark 中专门的每键组合器之一可以更快”。您的用例对于上面的解决方案来说足够简单。
按键分组
也可以用以下方法解决这个问题groupByKey
, 但它减少了并行化因此对于大数据集来说可能会慢得多。