Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 在Spark中反转一对多转换_Apache Spark_Dataframe - Fatal编程技术网

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的情况下,洗牌是非常高的,许多任务在一段时间后失败,当尝试重新尝试时,文件已经写入,因为一些数据已经写入。如何有效地写入转换后的数据帧而不失败,因为转换部分已经就绪。