说,我有两个文本文件 - 在HDFS或本地文件系统中。我知道每个都包含N
行l1_1
,l1_2
,......,l2_1
,l2_2
,....线的长度可能会有很大差异,我不提前知道。我读了这些文件:
val textFile1 = sc.textFile("file1.txt")
val textFile2 = sc.textFile("file2.txt")
现在我拉链了:
val zipped = textFile1 zip textFile2
Spark是否保证按行顺序压缩行,即l1_1
l2_1
,l1_2
l2_2
等?如果没有,我该怎么做才能确保这一点?
答案 0 :(得分:1)
是的,确实如此:
scala> val rdd1 = sc.parallelize(List.tabulate(10)((x) => x))
rdd1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[2] at parallelize at <console>:21
scala> val rdd2 = sc.parallelize(List("a", "b", "c", "d", "e", "f", "g", "h", "i", "j"))
rdd2: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[3] at parallelize at <console>:21
scala> val rdd3 = rdd1 zip rdd2
rdd3: org.apache.spark.rdd.RDD[(Int, String)] = ZippedPartitionsRDD2[4] at zip at <console>:26
scala> rdd3.take(10)
res2: Array[(Int, String)] = Array((0,a), (1,b), (2,c), (3,d), (4,e), (5,f), (6,g), (7,h), (8,i), (9,j))
textFile
为您提供RDD
每行一个String
元素,无论行的大小如何,即使您从HDFS读取也是如此。 zip
的语义是常量并始终遵循行的交错,只是因为zip
返回RDD
对行。但请注意,zip
仅适用于每个分区具有相同元素数量的RDD
(因此,这也必须表示您的RDD
包含相同数量的线)。
如果您对repartition
的默认分区不满意,请考虑textFile
。查看toDebugString
或this以检查RDD
的内容。