我有两个具有以下结构的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))
答案 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,然后将其映射以计算总和