Apache spark 在Spark中反转一对多转换
我有一个类似的数据集Apache spark 在Spark中反转一对多转换,apache-spark,dataframe,Apache Spark,Dataframe,我有一个类似的数据集 a1<tab>b1,b2,b3,b4 a2<tab>b1,b2,b3 ........ ........ ........ aN<tab>bX,bY,bZ 如何在不阻塞堆空间的情况下实现同样的效果 我使用mapPartitions进行分区转换以避免混乱,然后使用distcp按键合并。但是,当一个键的值的数目很大时,spark作业似乎失败了 相关代码段如下: val res_rdd=rdd.mapPartitions{ ite
a1<tab>b1,b2,b3,b4
a2<tab>b1,b2,b3
........
........
........
aN<tab>bX,bY,bZ
如何在不阻塞堆空间的情况下实现同样的效果
我使用mapPartitions进行分区转换以避免混乱,然后使用distcp按键合并。但是,当一个键的值的数目很大时,spark作业似乎失败了
相关代码段如下:
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”。请不要转换为
列表
迭代器
没有理由把一切都记在记忆里
mapPartitions
没有任何好处,最好始终使用Dataset
:
import org.apache.spark.sql.functions._
spark.read.option("delimiter", "\t").csv(path).toDF("key", "value")
.withColumn("value", explode(split(col("value"), ",")))
请不要转换为
列表
迭代器
没有理由把一切都记在记忆里
mapPartitions
没有任何好处,最好始终使用Dataset
:
import org.apache.spark.sql.functions._
spark.read.option("delimiter", "\t").csv(path).toDF("key", "value")
.withColumn("value", explode(split(col("value"), ",")))
实际上,我还必须通过“newKey”对值进行分组。基本上,最后,我需要每个“newKey”一个文件,并逐行记录所有“newValue”。在没有mapPartitions的情况下,洗牌是非常高的,许多任务在一段时间后失败,当尝试重新尝试时,它给出了已经写入的文件,因为一些数据已经写入。如何有效地写入转换后的数据帧而不失败,因为转换部分已经好了。实际上,我还必须通过“newKey”对值进行分组。基本上,最后,我需要每个“newKey”一个文件,并逐行记录所有“newValue”。在没有mapPartitions的情况下,洗牌是非常高的,许多任务在一段时间后失败,当尝试重新尝试时,文件已经写入,因为一些数据已经写入。如何有效地写入转换后的数据帧而不失败,因为转换部分已经就绪。