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中的任何其他技术。
答案 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
任何帮助将不胜感激。 感谢。