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 - 将每个分区的字符串连接到单个字符串的主要内容,如果未能解决你的问题,请参考以下文章

将字符串连接到 pig 中的字段

播放 wav 文件,将字符串连接到调用文件

将字符串连接到列表[重复]

如何将字符串连接到刀片中的 $ 变量?

使用 write() 将两个字符串连接到 C 中的标准输出

将 C# 字符串连接到 JavaScript/knockout 函数/observables