Python Pybark还原基

Python Pybark还原基,python,pyspark,Python,Pyspark,我试着让它工作了一段时间,但每次都失败了。我有两个文件。其中一个有一个姓名列表: 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,5

我试着让它工作了一段时间,但每次都失败了。我有两个文件。其中一个有一个姓名列表:

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对象):


现在,我需要将每个名称的所有值串联在一个列表中,但每个按键映射的值(我尝试的值)都会返回错误的结果

您可以简单地循环浏览每一个,然后使用创建一个字典。范例-

>>> 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]}
d = {}
for i in ll:
    c = i.collect()
    for tup in i:
            d.setdefault(tup[0],[]).extend(tup[1])

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

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

func = lambda x,y: x+y
然后将其发送到
reduceByKey
方法-

object.reduceByKey(func)

根据注释,实际上OP有一个RDD对象列表(不是单个RDD对象),在这种情况下,您可以通过调用将RDD对象转换为一个列表,然后执行逻辑,然后您可以决定是将结果作为python字典还是RDD对象(如果您想先这样做)。您可以调用
dict.items()
获取键值对,然后调用
sc.parralileze
。范例-

>>> 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]}
d = {}
for i in ll:
    c = i.collect()
    for tup in i:
            d.setdefault(tup[0],[]).extend(tup[1])

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

前面的结果是RDD对象,所以当我尝试应用该函数时,我得到的消息是RDD对象不是iterableI正在获取AttributeError:“list”对象没有属性“reduceByKey”好的,我想我看到了图片,您有一个RDD对象的列表?如何将每个RDD元素转换为列表。在上面的回答中举个例子,我不知道怎么做。我会多读一点,看看我能不能从我所做的事情中找出一个更聪明的方法来解决这个问题。