在 Spark 中反向一对多转换



我有一个像这样的数据集

a1<tab>b1,b2,b3,b4
a2<tab>b1,b2,b3
........
........
........
aN<tab>bX,bY,bZ

我想将其转换为反向时尚,即

    b1 -> a1
    b1 -> aY
....
....
    b2 -> aX
    b2 -> aY
    b2 -> aZ
....
....
    bN -> a1
    bN -> aY

如何在不堵塞堆空间的情况下实现相同的目标?

我使用 mapPartitions 进行分区转换以避免随机转换,然后使用 distcp 按键合并。但是,当一个键的值数量很多时,火花作业似乎会失败。

相关代码片段如下:

val res_rdd=rdd.mapPartitions{
      iterator => {
                    iterator.toList
                      .map(f => (f.split("t")(1).split(","),f.split("t")(0))).flatMap(k => k._1.map(y=> (y,k._2)))
                      .iterator
                   }
    }

    import sqlContext.implicits._
    val df=res_rdd.toDF("newKey","newValue")
    df.write.partitionBy("newKey").text(outputPath)

最终结果需要为每个"newKey"文件提供所有"newValue"。

请不要转换为List iterator.toList

没有理由将所有内容保留在内存中。

mapPartitions没有收获,最好一直使用Dataset

import org.apache.spark.sql.functions._
spark.read.option("delimiter", "t").csv(path).toDF("key", "value")
  .withColumn("value", explode(split(col("value"), ",")))

最新更新