Apache Spark:读取文件并压缩行

时间:2015-08-05 12:45:58

标签: apache-spark

说,我有两个文本文件 - 在HDFS或本地文件系统中。我知道每个都包含Nl1_1l1_2,......,l2_1l2_2,....线的长度可能会有很大差异,我不提前知道。我读了这些文件:

val textFile1 = sc.textFile("file1.txt")
val textFile2 = sc.textFile("file2.txt")

现在我拉链了:

val zipped = textFile1 zip textFile2

Spark是否保证按行顺序压缩行,即l1_1 l2_1l1_2 l2_2等?如果没有,我该怎么做才能确保这一点?

1 个答案:

答案 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。查看toDebugStringthis以检查RDD的内容。