使用连接使用Python Spark代码聚合两个文件的结果

时间:2015-09-28 12:42:22

标签: python join apache-spark hdfs

Hello Everyone我是python和spark的新手,所以我需要你的帮助。 我有两个文件,我使用SparkContext

加载它们
file1 = sc.textFile("hdfs://localhost:9000/data/out1/part-00000")
file2 = sc.textFile("hdfs://localhost:9000/data/out2/part-00000")

File1包含以下数据。

c_id   date         TM        cn_id      c_val  tc
10201   2015-4-15  00:00:00  56707065  0         0
10201   2015-4-15  00:00:00  56707066  1         0
10201   2015-4-15  00:00:00  56707067  200       0

同样有多个c_id,并且对于每个c_id,cn_id是不同的,并且文件1中的c_value是不同的,tc是固定的,即0。

File2包含以下数据。

c_id   dt          tm        cn_id      c_val  tc
10201   2015-4-15  01:00:00  56707065  300      1
10201   2015-4-15  01:00:00  56707066  60        1
10201   2015-4-15  01:00:00  56707067  20        1

这里tc是固定的,即1

文件1中的所有值都相同而文件2只有c_val根据cn_id改变所以我想要包含c_val之和的第三个文件,即c_id 10201&对于cn_id 56707065,我想要像10201 2015-4-15 01:00:00 56707065 0+300 =300这样的结果,所以最后第三个文件中的输出将是,

10201   2015-4-15  01:00:00  56707065 300 1

类似地,cn_id 56707066,56707067聚合结果并将其放入第三个文件中。请建议我使用python spark snippet。

我希望这个结果使用连接python spark或者使用pyhton的spark中的任何其他技术。

2 个答案:

答案 0 :(得分:0)

嗯,我想你可以加入cn_id然后加起来c_val

你有2个简单的方法,一个是用索引压缩每个文件(在scala-spark中,我使用zipWithIndex,并结合结果,groupBy压缩id,并通过添加c_val列来减少。

你的第二个解决方案是zip和add(自动保留索引)在scala我的代码看起来像:

varying

解决方案3,似乎你的cn_id也可用于索引正确的对。你可以做:     filea.union(fileb).groupBy(_。cn_id)并通过添加减少c_val

答案 1 :(得分:0)

我合并了两个文件并制作了单独的文件。它还包含一些float c_val,我有以下代码

from pyspark import SparkContext
sc = SparkContext("local", "Aggregate")
file1 = sc.textFile("hdfs://localhost:9000/data/parse/combine/joined.txt")
file2 = file1.flatMap(lambda line: line.split(','))\
             .map(lambda x: (x[0] + ',' + x[3], float(x[4])))\
             .reduceByKey(lambda a,b:a+b).coalesce(1)

final_agg = file2.map(lambda x: (x[0]+','+ x[3], float(x[4])))\
                 .reduceByKey(lambda a,b:a+b)\
                 .coalesce(1)
print(file2.collect())

我收到以下错误

  

ValueError:无法将字符串转换为float:

根据上面的代码,预期输出为:

[( '10201,56707065',300), ('10201,56707066',61)] 

并且输入文件包含如下数据:

10201,  '2015-4-15',  '00:00:00',  56707065,    '0',    0
10201   '2015-4-15',  '00:00:00',  56707066,    '1',    0
10201   '2015-4-15',  '00:00:00',  56707067,    '200',  0
10201,  '2015-4-15',  '00:30:00',  56707065,    '300',  1
10201   '2015-4-15',  '00:30:00',  56707066,     '60',  1
10201   '2015-4-15',  '00:30:00',  56707067,     '20',  1

任何帮助将不胜感激。 感谢。