将RDD的每个元素添加到spark scala中另一个RDD的每个元素。

时间:2017-03-08 10:47:26

标签: scala apache-spark spark-dataframe

我有两个具有以下结构的RDD

org.apache.spark.rdd.RDD[(Long, Double)]

此处每行RDD包含索引Long和值Double。我想将RDD的每个元素添加到spark scala中的其他RDD的每个元素。

示例如下:

RDD1集:

Array[(Long, Double)] = Array((0,-3),(1,2))

RDD2:

Array[(Long, Double)] = Array((0,4),(1,-2))

结果:

Array[(Long, Double)] = Array((0,1),(0,-5),(1,6),(1,0))

3 个答案:

答案 0 :(得分:1)

您在这里真正做的是两个rdd的笛卡尔积,您只需将每个结果((key, value), (key, value))对的求和,保持<第一个元组的em> key :

val result = rdd1.cartesian(rdd2).map(x => (x._1._1, x._2._2 + x._1._2))
// Result
result.collect()
Array[(Int, Int)] = Array((0,1), (0,-5), (1,6), (1,0))

小心使用cartesian(),内存消耗会显着增加你的rdd越大。

答案 1 :(得分:0)

请试试这个:

val df1 = Seq((0,-3),(1,2)).toDF("col1", "col2")
val df2 = Seq((0,4),(1,-2)).toDF("col1", "col2")

df1.createOrReplaceTempView("temp1")
df2.createOrReplaceTempView("temp2")

spark.sql("SELECT t1.col1 + t2.col1, t1.col2 + t2.col2 FROM t1, t2").show

答案 2 :(得分:0)

压缩两个RDD,然后将其映射以计算总和