转换中的RDD查找

时间:2016-05-05 19:13:57

标签: scala apache-spark rdd

我有2个配对的RDD,如下所示

RDD1包含名称作为键,zipcode包含值:

  

RDD1 - > RDD((ashley,20171),(yash,33613),(evan,40217))

RDD2包含密码和一些随机数作为值:

  

RDD2 - > RDD((20171,23553),(33613,345345345),(40189,44355217),   (40122,2345235),(40127,232323424))

我需要用RDD2中的相应值替换RDD1中的zipcodes。所以输出将是

  

RDD3 - > RDD((ashley,235523),(yash,345345345),(evan,232323424))

我尝试使用如下所示的RDD查找方法,但我得到例外,说RDD转换无法在另一个RDD转换中执行

val rdd3 = rdd1.map( x => (x._1, rdd2.lookup(x._2)(0)) )

1 个答案:

答案 0 :(得分:6)

Yon可以通过zipcode简单地加入2个RDD:

rdd1.map({case (name, zipcode) => (zipcode, name)})
    .join(rdd2)
    .map({case (zipcode, (name, number)) => (name, number)})
    .collect()

注意,这将只返回在rdd1和rdd2中具有匹配的zipcodes的记录。如果要为rdd1中的记录设置一些默认编号,即rdd2中没有相应的邮政编码,请使用 leftOuterJoin join

rdd1.map({case (name, zipcode) => (zipcode, name)})
    .leftOuterJoin(rdd2)
    .map({case (zipcode, (name, number)) => (name, number.getOrElse(0))})
    .collect()