我对Spark很新,并且遇到以下问题:
在上一个作业中,我创建了两个大文件,其中每行包含一对id和一个相应的值,例如。
(id1,id2,value)
我做的第一件事是从hdfs读取文件并将它们映射到元组,如:
((id1,id2),value)
def line_to_tuple(line):
x = eval(line)
return ((x[0], x[1]), x[2])
rdd0 = sc.textFile('hdfs:///user/xxx/file1')
.map(lambda x: line_to_tuple(x))
rdd1 = sc.textFile('hdfs:///user/xxx/file2')
.map(lambda x: line_to_tuple(x))
Q1:有更有效的方法吗?我可以用其他方式存储数据,这样我每次读入时都不必评估每一行吗?
在下一步中,我使用cogroup,然后过滤掉这篇文章中的空结果,然后将结果写回hdfs:
rdd0.cogroup(rdd1).filter(lambda x: x[1][0] and x[1][1])
.map(lambda x: (x[0], list(x[1][0])[0], list(x[1][1])[0]) )
.saveAsTextFile('hdfs:///user/xxx/cogrouped_values')
这些工作的结果如下:
((id1,id2),value_file1,value_file2)
第二季度:我的代码有效,但它占用了大量资源,我一直在问自己,鉴于以下假设是否有任何进一步改进的方法: