Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将两个RDD的列添加到单个RDD中,然后根据PySpark中的日期数据聚合行_Python_Apache Spark_Aggregate_Pyspark_Rdd - Fatal编程技术网

Python 如何将两个RDD的列添加到单个RDD中,然后根据PySpark中的日期数据聚合行

Python 如何将两个RDD的列添加到单个RDD中,然后根据PySpark中的日期数据聚合行,python,apache-spark,aggregate,pyspark,rdd,Python,Apache Spark,Aggregate,Pyspark,Rdd,我在PySpark中有两个RDD: RDD1: [(u'2013-01-31 00:00:00', u'a', u'Pab', u'abc', u'd'),(u'2013-01-31 00:00:00', u'a', u'ab', u'abc', u'g'),.....] [(u'41',u'42.0'),(u'24',u'98.0'),....] [('2013-01-31 00:00:00', 'a', 'Pab', 'abc', 'd',42.0),('2013-01-31 00:00

我在PySpark中有两个
RDD

RDD1:

[(u'2013-01-31 00:00:00', u'a', u'Pab', u'abc', u'd'),(u'2013-01-31 00:00:00', u'a', u'ab', u'abc', u'g'),.....]
[(u'41',u'42.0'),(u'24',u'98.0'),....]
[('2013-01-31 00:00:00', 'a', 'Pab', 'abc', 'd',42.0),('2013-01-31 00:00:00', 'a', 'ab', u'abc', 'g',98.0),.....]
RDD2:

[(u'2013-01-31 00:00:00', u'a', u'Pab', u'abc', u'd'),(u'2013-01-31 00:00:00', u'a', u'ab', u'abc', u'g'),.....]
[(u'41',u'42.0'),(u'24',u'98.0'),....]
[('2013-01-31 00:00:00', 'a', 'Pab', 'abc', 'd',42.0),('2013-01-31 00:00:00', 'a', 'ab', u'abc', 'g',98.0),.....]
两个
rdd
的行数或行数相同。现在,我要做的是从RDD1(从
unicode
转换为普通
string
)中获取每行中的所有列,并从RDD2(从
unicode string
转换为
float
)中获取每行中的第二列,然后用它们形成一个新的RDD。因此,新的RDD将如下所示:

RDD3:

[(u'2013-01-31 00:00:00', u'a', u'Pab', u'abc', u'd'),(u'2013-01-31 00:00:00', u'a', u'ab', u'abc', u'g'),.....]
[(u'41',u'42.0'),(u'24',u'98.0'),....]
[('2013-01-31 00:00:00', 'a', 'Pab', 'abc', 'd',42.0),('2013-01-31 00:00:00', 'a', 'ab', u'abc', 'g',98.0),.....]
完成后,我想通过第1列中的
日期
值对新的
RDD3
中每行的最后一个值(浮点值)进行
聚合。如果是
date
2013-01-31 00:00:00
的所有行,则应添加其最后的数值


我如何在PySpark中做到这一点?

对于问题的第一部分,即将两个RDD组合成一个,其中每行是7的元组,您可以这样做:

rdd3 = rdd1.zip(rdd2).map(lambda ((a,b,c,d,e), (f,g)): (a,b,c,d,e,f,g))
我不确定你最终需要什么,只是日期和第二个值的总和吗?如果是,则不需要所有值:

rdd3 = rdd1.zip(rdd2).map(lambda ((a,b,c,d,e), (f,g)): (a,g))
rdd4 = rdd3.reduceByKey(lambda x, y: x+y)
您需要创建
rdd
,此方法使用您的数据和另一个表示该项索引的值创建一个元组,因此您可以通过
index
将这两个
rdd
连接起来

您的方法应该类似于(我打赌有更有效的方法):

输出将是:
[(0,(u'A',0)),(4,(u'Z',4)),(1,(u'B',1)),(2,(u'C',2)),(3,(u'A',3))
,之后只需要一张
地图来重新组合数据。例如:

combinedRDD = zdd1.join(zdd2).map(lambda (k, v): v)
print combinedRDD.collect()

# You can use the .zip method combinedRDD = rdd1.zip(rdd2)
输出将是:
[(u'A',0),(u'Z',4),(u'B',1),(u'C',2),(u'A',3)]

关于数据类型转换,我以前遇到过这个问题,为了解决这个问题,我使用了


将输出:
[('A',0),('Z',4),('B',1),('C',2),('A',3)]

您没有加入他们的密钥,因此我认为您必须压缩…@AlbertoBonsanto您可以演示我如何做到这一点吗?@AlbertoBonsanto将
rdd3=izip(rdd1.tolocatertor(),rdd2.tolocatertor())
足够了吗?不,这将是本地压缩。你需要压缩RDD。检查文档。(我使用Scala,所以我也不知道Python语法。)是的,在rdd4(聚合后的一个)中,我需要聚合后的日期和最后一个值。所以,这个答案对您有用吗,或者您需要更多的帮助?