Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala apachespark';s RDD根据特定大小进行拆分_Scala_Apache Spark_Rdd - Fatal编程技术网

Scala apachespark';s 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)

我试图从文本文件中读取字符串,但我想根据特定的大小限制每一行。比如,

这是我的文件

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)
但是我想限制这个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