Join 加入spark时如何跳过空rdd
我想从Cassandra那里得到2RDD,然后加入他们。我想跳过空值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
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更有效。