如何在Spark中过滤Cassandra中的空数据?

时间:2017-07-20 07:32:07

标签: apache-spark cassandra

我想过滤从Cassandra中选择的Null值。

这是我的问题:

scala> var rdd =  sc.cassandraTable("keyspace", "table").select("month", "timetag", "name").where("month = ?", "201704")
scala> var data = rdd.filter(_.getString("name") != null)

如果我使用getString(" xxx")与null比较,它将显示

  

" java.lang.NullPointerException:第2列的意外空值。   使用get [Option [...]]接收空值。"

之后,我尝试使用getStringOption进行比较。

scala> var rdd =  sc.cassandraTable("keyspace", "table").select("month", "timetag", "name").where("month = ?", "201704")
scala> var data = rdd.filter(_.getStringOption("name") != null)

这一次,它没有显示任何错误消息。但数据未经过筛选。空数据仍然存在。

有谁知道 getString getStringOption 之间的区别? 或者还有其他方法可以比较来自Cassandra 的数据是 null 吗?

非常感谢!

2 个答案:

答案 0 :(得分:2)

尝试做:

_.getStringOption("name").isDefined

而不是:

 _.getStringOption("name") != null

<强>更新

在选项部分展开一点可能是相关的。

getStringOption(内部实现为get [Option [String]]返回一个scala Option类。

选项是函数式编程中的惯用方法,用于表示具有某些值(表示为Some(value))或没有值(表示为None)的内容。

与在java中使用null不同,None实际上是具有各种功能的对象(此处的示例是isDefined)。这使得在对象上组合多个操作变得容易,同时确保如果路上的某些东西没有被定义,那么我们就不会得到空指针异常。

有关选项类型的详细信息,请参阅the scala class documentationthis stack overflow answerthis stack overflow answer

答案 1 :(得分:0)

当您希望收到Cassandra null值

时,请使用getOption变体
_.get[Option[String]]("name")
res8: Option[String] = Some(abc)