zip RDD由不同的输入文件构成

时间:2016-04-02 16:55:03

标签: apache-spark rdd

我有两个HDFS文件,行数相同。文件中的行按行号相互对应。

open my $fh, "<", "ps.txt" or die "Failed to open ps.txt: $!";
local $/;
my $file_contents = <$fh>;

我的问题是如何使用lines2正确压缩rdd lines1?

lines1=sc.textFile('1.txt')  
lines2=sc.textFile('2.txt')

Zip需要相同大小的RDD和相同的分区(据我所知,不仅分区计数,而且每个分区中的元素数量相等)。第一个要求已经满足。 如何确保第二个?

谢谢!

塞吉。

1 个答案:

答案 0 :(得分:1)

通常,不满足任何条件,zip不是执行此类操作的好工具。每个分区的分区数和元素数不仅取决于行数,还取决于文件大小,单个文件的大小和配置。

zip在连接RDD时非常有用,这些RDD可以是共同的祖先,并且不会被shuffle分隔,例如:

parent = sc.parallelize(range(100))
child1 = parent.map(some_func)
child2 = parent.map(other_func)
child1.zip(child2)

要逐行合并RDD,您可以执行以下操作:

def index_and_sort(rdd):
    def swap(xy):
        x, y = xy
        return y, x
    return rdd.zipWithIndex().map(swap).sortByKey()

index_and_sort(lines1).join(index_and_sort(lines)).values()

索引和排序后zip应该是安全的:

from pyspark import RDD

RDD.zip(*(index_and_sort(rdd).values() for rdd in [lines1, lines2]))

但为什么甚至打扰?

Scala等价物:

import org.apache.spark.rdd.RDD

def indexAndSort(rdd: RDD[String]) = rdd.zipWithIndex.map(_.swap).sortByKey()

indexAndSort(lines1).join(indexAndSort(lines2)).values