Scala apachespark';s RDD根据特定大小进行拆分
我试图从文本文件中读取字符串,但我想根据特定的大小限制每一行。比如, 这是我的文件 AAAA\nbbb\NCCCC 当试图通过sc.textFile读取此文件时,RDD将显示此文件Scala apachespark';s RDD根据特定大小进行拆分,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我试图从文本文件中读取字符串,但我想根据特定的大小限制每一行。比如, 这是我的文件 AAAA\nbbb\NCCCC 当试图通过sc.textFile读取此文件时,RDD将显示此文件 scala> val rdd = sc.textFile("textFile") scala> rdd.collect res1: Array[String] = Array(aaaaa, bbb, ccccc) Array[String] = Array(aaa, aab, bbc, ccc, c)
scala> val rdd = sc.textFile("textFile")
scala> rdd.collect
res1: Array[String] = Array(aaaaa, bbb, ccccc)
Array[String] = Array(aaa, aab, bbc, ccc, c)
但是我想限制这个RDD的大小。例如,如果极限是3,那么我应该得到这个
scala> val rdd = sc.textFile("textFile")
scala> rdd.collect
res1: Array[String] = Array(aaaaa, bbb, ccccc)
Array[String] = Array(aaa, aab, bbc, ccc, c)
实现这一点的最佳性能方法是什么?您无论如何都需要读取所有数据。除了映射每条线并修剪它之外,您可以做的事情不多
rdd.map(line => line.take(3)).collect()
这不是一个特别有效的解决方案(也不可怕),但您可以这样做:
val pairs = rdd
.flatMap(x => x) // Flatten
.zipWithIndex // Add indices
.keyBy(_._2 / 3) // Key by index / n
// We'll use a range partitioner to minimize the shuffle
val partitioner = new RangePartitioner(pairs.partitions.size, pairs)
pairs
.groupByKey(partitioner) // group
// Sort, drop index, concat
.mapValues(_.toSeq.sortBy(_._2).map(_._1).mkString(""))
.sortByKey()
.values
通过显式地传递填充分区所需的数据可以避免混乱,但是编码需要一些努力。看看我对你的回答
如果您可以接受分区边界上的一些未对齐记录,那么简单的mapPartitions
with grouped应该以更低的成本完成这项任务:
rdd.mapPartitions(_.flatMap(x => x).grouped(3).map(_.mkString("")))
也可以使用滑动RDD:
rdd.flatMap(x => x).sliding(3, 3).map(_.mkString(""))
我不认为是这样。再看一看预期的输出。那么您想忽略行边界并拆分为
n
字符组吗?几乎可以肯定的是,将这个外部火花预处理成长度为n
的行,然后用textFile