Pyspark:在嵌套列表中合并值

时间:2016-11-18 07:04:37

标签: python apache-spark pyspark rdd

我有一对结构的RDD: [(key,[(timestring,value)]]

示例:

[("key1", [("20161101", 23), ("20161101", 41), ("20161102", 66),...]),
 ("key2", [("20161101", 86), ("20161101", 9), ("20161102", 11),...])
  ...]

我想处理每个键的列表,按时间串分组并计算相同时间串的所有值的平均值。所以上面的例子将成为:

[("key1", [("20161101", 32), ..]),
 ("key2", [("20161101", 47.5),...])
  ...]

我很难找到一个只使用Pyspark方法的解决方案,是否可能或者我是否需要使用一些中间步骤?

1 个答案:

答案 0 :(得分:1)

您可以定义一个功能:

from itertools import groupby
import numpy as np

def mapper(xs):
    return [(k, np.mean([v[1] for v in vs])) for k, vs in groupby(sorted(xs), lambda x: x[0])]

mapValues

rdd = sc.parallelize([
    ("key1", [("20161101", 23), ("20161101", 41), ("20161102", 66)]),
    ("key2", [("20161101", 86), ("20161101", 9), ("20161102", 11)])
])

rdd.mapValues(mapper)