Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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类型的4RDD:((int,int,int),值),我的RDD是 rdd1: ((a,b,c), value) rdd2:((a,d,e),valueA) rdd3:((f,b,g),valueB) rdd4:((h,i,c),valueC) 如何加入RDD,如“a”上的rdd1加入rdd2“b”上的rdd1加入rdd2“c”上的rdd1加入rdd3 所以输出是Scala中的finalRdd:((a,b,c),valueA,valueB,valueC,value)) 我试着用c

我有RDD类型的4RDD:((int,int,int),值),我的RDD是

rdd1: ((a,b,c), value) 
rdd2:((a,d,e),valueA) 
rdd3:((f,b,g),valueB)
rdd4:((h,i,c),valueC) 
如何加入RDD,如“a”上的rdd1加入rdd2“b”上的rdd1加入rdd2“c”上的rdd1加入rdd3

所以输出是Scala中的
finalRdd:((a,b,c),valueA,valueB,valueC,value))

我试着用collectAsMap做这件事,但效果不好,引发了异常

仅针对rdd1和rdd2的代码

val newrdd2=rdd2.map{case( (a,b,c),d)=>(a,d)}.collectAsMap
val joined=rdd1.map{case( (a,b,c),d)=>(newrdd2.get(a).get,b,c,d)} 
范例

rdd1: ((1,2,3),animals)
rdd2:((1,anyInt,anyInt),cat)
rdd3:((anyInt,2,anyInt),cow )
rdd 4: ((anyInt,anyInt,3),parrot)

输出应该是
((1,2,3),动物,猫,牛,鹦鹉)

在RDD上有一个方便的
join
方法,但是您需要通过特定的join键对其进行键控,这就是Spark用于分区和洗牌的方法

发件人:

join(otherDataset,[numTasks]):在(K,V)和(K,W)类型的数据集上调用时,返回一个(K,(V,W))对的数据集,其中包含每个键的所有元素对。通过leftOuterJoin、rightOuterJoin和fullOuterJoin支持外部联接

我无法在我所在的位置编译,但手工编译的结果如下:

val rdd1KeyA = rdd1.map(x => (x._1._1, (x._1._2, x._1._3. x._2) // RDD(a, (b,c,value))
val rdd2KeyA = rdd2.map(x => (x._1._1, x._2) // RDD(a, valueA)
val joined1 = rdd1KeyA.join(rdd2KeyA) // RDD(a, ((b,c,value), valueA))

val rdd3KeyB = rdd3.map(x => (x._1._2, x._2) // RDD(b, valueB)
val joined1KeyB = joined1.map(x => (x._2._1._1, (x._1, x._2._1._2, x._2._1._3. x._2._2) // RDD(b, (a, c, value, valueA))
val joined2 = joined1KeyB.join(rdd3keyB) // RDD(b, ((a, c, value, valueA), valueB))
……等等


避免使用
collect*
函数,因为它们不使用数据的分布式特性,并且在大负载时容易失败,它们会将RDD上的所有数据洗牌到主节点上的内存集合中,可能会破坏所有内容。

您能写一个RDD内数据的更好示例吗?我添加了一个示例,不管anyInt字段上的数字是多少,rdd1中是否有重复的行?重复的钥匙?(例如,带有
(1,2,3)
和值“动物”和“另一动物”的两个元素)