我有一个包含文件行的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?
答案 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