Spark - 将每个分区的字符串连接到单个字符串
Posted
技术标签:
【中文标题】Spark - 将每个分区的字符串连接到单个字符串【英文标题】:Spark - concatenate strings of each partition to a single string 【发布时间】:2016-02-20 16:19:53 【问题描述】:我有一个包含文件行的 RDD。我希望每个分区不包含行,但包含连接的行。例如:
Partition 1 Partition 2
line 1 line n/2+1
line 2 line n/2+2
. .
. .
. .
line n/2 line n
上面的图 1 显示了我的 RDD,它是在我们使用 sc.textFile() 方法时产生的。我想从上图1转到下图(图2):
Partition 1 Partition 2
concatenatedLinesFrom1toN/2 concatenatedLinesFromN/2+1toN
有什么方法可以映射分区,以便我可以将 RDD 从图 1 转换为图 2 中的那个?
【问题讨论】:
【参考方案1】:如果您需要统一的对象大小(内存大小/字符数):
rdd.glom.map(_.mkString)
如果你想要一个相对统一的行数而不是统一的大小:
import org.apache.spark.RangePartitioner
val indexed = rdd.zipWithIndex.map(_.swap)
indexed.partitionBy(new RangePartitioner(2, indexed))
.values
.glom
.map(_.mkString)
其中rdd
是从textFile
或类似方法返回的RDD[String]
。
【讨论】:
【参考方案2】:您可以使用rdd.mapPartitions(itr)
来实现此目的。
编辑
res0.mapPartitions(x=>Seq(x.mkString("")).iterator).collect
【讨论】:
也许可以详细说明这如何帮助 OP。简单地说“使用这种方法”通常没有太大帮助。以上是关于Spark - 将每个分区的字符串连接到单个字符串的主要内容,如果未能解决你的问题,请参考以下文章