我们可以通过忽略它们在spark中的值类型来结合2个RDD

时间:2017-11-22 20:05:43

标签: apache-spark

期望的输出:

Array((h, (None, Some(12))), (a, (Some(2), None)), (b,(Some(5), None)), 
      (c, (Some(4), None)), (d, (Some(12), None)), (e,  (None, Some(2))),
      (f, (None, Some(5))), (g, (None, Some(4))))

代码:

val a = sc.parallelize(List(("a",2),("b",5),("c",4),("d",12)))

val b = sc.parallelize(List(("e",2),("f",5),("g",4),("h",12)))

val c = a.map{case(k,v) => (k) -> (Some(v),None)}

val d = b.map{case(k,v) => (k) -> (None,Some(v))}

val e = c.union(d) 

在做c.union(d)时我得到了类型不匹配错误。 有人可以帮助,解决这个问题的方法是正确的,还是我需要采取其他方法。

提前致谢。

2 个答案:

答案 0 :(得分:2)

这里的问题是,由于您没有在RDD中指定元素的类型,因此scala会尝试推断它们,并使用Type.none,它在union中与Some[Int]和{{}}不同{1}}。

要使联合工作,您必须确保数据具有相同的类型。一种方法是确保所有内容都是Some[String]

Option[Any]

答案 1 :(得分:1)

只需注释类型:

    def PnUcompare(X,Y):
        if X == Y:
            return True
        else:
            return False