PySpark ReduceByKey

时间:2015-08-16 18:47:43

标签: python pyspark

我一直试图让它工作一段时间,但每次都失败了。我有2个文件。一个有一个名单:

Name1
Name2
Name3
Name4

另一个是与几年中每年每天的名称相关联的值列表:

['0.1,0.2,0.3,0.4',
 '0.5,0.6,0.7,0.8', 
 '10,1000,0.2,5000'
  ...]

目标是输出如下:

Name1: [0.1,0.5,10]
Name2: [0.2,0.6,1000]
Name3:[0.3,0.7,0.2]
Name4:[0.4,0.8,5000]

然后绘制每个的直方图。我写了一个映射器,它创建了一个产生以下输出的元组列表(这是一个RDD对象):

[[('Name1', [0.1]),('Name2', [0,2]),('Name3', [0.3]),('Name4', [0.4])],
[('Name1', [0.5]),('Name2', [0,6]),('Name3', [0.7]),('Name4', [0.8])],
[('Name1', [10]),('Name2', [1000]),('Name3', [0.8]),('Name4', [5000])]]

现在我需要在单个列表中连接每个名称的所有值,但是每个按键映射的值,我尝试的值都会返回错误的结果。

1 个答案:

答案 0 :(得分:0)

您可以使用dict.setdefault()循环浏览每个字词并从中创建字典。示例 -

>>> ll = [[('Name1', [0.1]),('Name2', [0,2]),('Name3', [0.3]),('Name4', [0.4])],
... [('Name1', [0.5]),('Name2', [0,6]),('Name3', [0.7]),('Name4', [0.8])],
... [('Name1', [10]),('Name2', [1000]),('Name3', [0.8]),('Name4', [5000])]]
>>> d = {}
>>> for i in ll:
...     for tup in i:
...             d.setdefault(tup[0],[]).extend(tup[1])
...
>>> pprint.pprint(d)
{'Name1': [0.1, 0.5, 10],
 'Name2': [0, 2, 0, 6, 1000],
 'Name3': [0.3, 0.7, 0.8],
 'Name4': [0.4, 0.8, 5000]}

对于Pyspark RDD对象,尝试一个简单的reduce函数,如 -

func = lambda x,y: x+y

然后将其发送到reduceByKey方法 -

object.reduceByKey(func)

根据评论,OP实际上有一个RDD对象列表(不是单个RDD对象),在这种情况下,您可以通过调用.collect()将RDD对象转换为列表,然后执行逻辑,然后如果你想要,你可以决定是将结果作为python字典还是RDD对象。您可以致电dict.items()获取键值对并致电sc.parrallelize。示例 -

d = {}
for i in ll:
    c = i.collect()
    for tup in i:
            d.setdefault(tup[0],[]).extend(tup[1])

rddobj = sc.parallelize(d.items())