Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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
Scala 加入RDD后删除括号_Scala_Apache Spark_Rdd - Fatal编程技术网

Scala 加入RDD后删除括号

Scala 加入RDD后删除括号,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我正在加入大量的rdd,我想知道是否有一种通用的方法可以删除在每个连接上创建的括号 以下是一个小样本: val rdd1 = sc.parallelize(Array((1,2),(2,4),(3,6))) val rdd2 = sc.parallelize(Array((1,7),(2,8),(3,6))) val rdd3 = sc.parallelize(Array((1,2),(2,4),(3,6))) val result = rdd1.join(rdd2).join(rdd3

我正在加入大量的rdd,我想知道是否有一种通用的方法可以删除在每个连接上创建的括号

以下是一个小样本:

val rdd1 =  sc.parallelize(Array((1,2),(2,4),(3,6)))
val rdd2 =  sc.parallelize(Array((1,7),(2,8),(3,6)))
val rdd3 =  sc.parallelize(Array((1,2),(2,4),(3,6)))

val result = rdd1.join(rdd2).join(rdd3)

res: result: org.apache.spark.rdd.RDD[(Int, ((Int, Int), Int))] = Array((1,((2,7),2)), (3,((4,8),4)), (3,((4,8),6)), (3,((4,6),4)), (3,((4,6),6)))
我知道我会用地图

result.map((x) => (x._1,(x._2._1._1,x._2._1._2,x._2._2))).collect

Array[(Int, (Int, Int, Int))] = Array((1,(2,7,2)), (2,(4,8,4)), (3,(6,6,6)))
但是,如果大量rdd都包含许多元素,那么很快就很难使用这种方法了

如果大量rdd都包含许多元素,这种方法根本不起作用,因为最大的内置元组仍然存在。如果将同构RDD连接到某种类型的序列:

def joinAndMerge(rdd1: RDD[(Int, Seq[Int])], rdd2: RDD[(Int, Seq[Int])]) = 
  rdd1.join(rdd2).mapValues{ case (x, y) => x ++ y }

Seq(rdd1, rdd2, rdd3).map(_.mapValues(Seq(_))).reduce(joinAndMerge)
如果您只有三个RDD,那么使用
cogroup

rdd1.cogroup(rdd2, rdd3)
  .flatMapValues { case (xs, ys, zs) => for {
    x <- xs; y <- ys; z <- zs 
  } yield (x, y, z) }
def joinByKey(df1: DataFrame, df2: DataFrame) = df1.join(df2, Seq("k"))

Seq(rdd1, rdd2, rdd3).map(_.toDF("k", "v")).reduce(joinByKey)