Spark - 将每个分区的字符串连接成一个字符串

时间:2016-02-20 16:19:54

标签: scala apache-spark

我有一个包含文件行的RDD。我希望每个分区不包含行,而是包含连接的行。例如:

● postgresql.service - PostgreSQL RDBMS
   Loaded: loaded (/lib/systemd/system/postgresql.service; enabled)
   Active: active (exited) since Sat 2016-02-20 15:22:22 UTC; 50min ago
  Process: 21070 ExecReload=/bin/true (code=exited, status=0/SUCCESS)
  Process: 21119 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
 Main PID: 21119 (code=exited, status=0/SUCCESS)

Feb 20 15:22:22 raspberrypi systemd[1]: Starting PostgreSQL RDBMS...
Feb 20 15:22:22 raspberrypi systemd[1]: Started PostgreSQL RDBMS.

上面的图1显示了我的RDD,它是在我们使用sc.textFile()方法时生成的。我想从上面的图1到下面的图(图2):

Partition 1        Partition 2
  line 1            line n/2+1
  line 2            line n/2+2
    .                  .
    .                  .
    .                  .
  line n/2          line n

有没有办法映射分区,以便将RDD从图1转换为图2中的RDD?

2 个答案:

答案 0 :(得分:3)

如果您需要统一的对象大小(内存大小/字符数):

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是从RDD[String]或类似方法返回的textFile

答案 1 :(得分:2)

您可以使用rdd.mapPartitions(itr)来实现此目的。 编辑 res0.mapPartitions(x=>Seq(x.mkString("")).iterator).collect