【问题标题】:Spark - concatenate strings of each partition to a single stringSpark - 将每个分区的字符串连接到单个字符串
【发布时间】: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 中的那个?

【问题讨论】:

    标签: scala apache-spark


    【解决方案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。简单地说“使用这种方法”通常没有太大帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 2020-07-11
      • 2022-06-17
      相关资源
      最近更新 更多