Join 加入spark时如何跳过空rdd

Join 加入spark时如何跳过空rdd,join,dictionary,cassandra,apache-spark,flatmap,Join,Dictionary,Cassandra,Apache Spark,Flatmap,我想从Cassandra那里得到2RDD,然后加入他们。我想跳过空值 def extractPair(rdd: RDD[CassandraRow]) = { rdd.map((row: CassandraRow) => { val name = row.getName("name") if (name == "") None //join wrong else (name, row.getUUID("object

我想从Cassandra那里得到2RDD,然后加入他们。我想跳过空值

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修复此问题

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

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

        })
      }

仅凭
地图
是不可能做到这一点的。您需要使用
过滤器来跟踪它。但您最好还是将有效结果包装在
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")))
  })
}

选项
可隐式转换为可展平类型,并能更好地传达您的方法信息。

这是可行的。Value join不是org.apache.spark.rdd.rdd[Some[(Any,java.util.UUID)]的成员。您使用的是
flatMap
?它应该去掉
一些
我给的flatMap代码可以工作,但我不知道如何使用map。因为我认为map比flatMap更有效。是什么让你认为map更有效?我在回答的第一部分提到了你的地图问题……你读过吗?或者只是试着复制代码?是的,我读了你的建议,但我不明白。Map用来输入一个输出,FlatMap用来输入一个输出,所以我认为Map更有效。