如何在加入spark时跳过空的rdd

时间:2015-06-24 03:39:49

标签: join dictionary cassandra apache-spark flatmap

我想从Cassandra获得2 rdd,然后加入他们。我想跳过空值。

def extractPair(rdd: RDD[CassandraRow]) = {
    rdd.map((row: CassandraRow) => {

     val name = row.getName("name")
     if (name == "")
         None   //join wrong
     else
        (name, row.getUUID("object"))

    })
  }

  val rdd1 = extractPair(cassRdd1)
  val rdd2 = extractPair(cassRdd2)
  val joinRdd = rdd1.join(rdd2)  //"None" join wrong

使用flatMap可以解决这个问题,但我想知道如何使用map fix this

def extractPair(rdd: RDD[CassandraRow]) = {
        rdd.flatMap((row: CassandraRow) => {

         val name = row.getName("name")
         if (name == "")
             seq()
         else
            Seq((name, row.getUUID("object")))

        })
      }

1 个答案:

答案 0 :(得分:0)

只有map才能实现这一点。您需要使用filter进行跟进。但你仍然最好将有效结果包装在Some中。但是,那么你仍然会把它包裹在Some中作为结果......需要第二个map来解开它。所以,实际上,你最好的选择是这样的:

def extractPair(rdd: RDD[CassandraRow]) = {
  rdd.flatMap((row: CassandraRow) => {
    val name = row.getName("name")
    if (name == "") None
    else Some((name, row.getUUID("object")))
  })
}

Option可隐式转换为flattenable类型,并更好地传达您的方法消息。