我有两个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和相同的分区(据我所知,不仅分区计数,而且每个分区中的元素数量相等)。第一个要求已经满足。 如何确保第二个?
谢谢!
塞吉。
答案 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