根据关键和群组绩效进行的pyspark交叉

时间:2017-08-14 15:44:39

标签: python hadoop apache-spark pyspark

我对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:

PySpark, intersection by Key

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)

第二季度:我的代码有效,但它占用了大量资源,我一直在问自己,鉴于以下假设是否有任何进一步改进的方法:

  1. 文件按id1和id2排序,id1始终小于id2
  2. rdd0<< rdd1(其中一个文件比另一个文件小得多)

0 个答案:

没有答案