我想从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")))
})
}
答案 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类型,并更好地传达您的方法消息。