我想过滤从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 吗?
非常感谢!
答案 0 :(得分:2)
尝试做:
_.getStringOption("name").isDefined
而不是:
_.getStringOption("name") != null
<强>更新强>
在选项部分展开一点可能是相关的。
getStringOption(内部实现为get [Option [String]]返回一个scala Option类。
选项是函数式编程中的惯用方法,用于表示具有某些值(表示为Some(value))或没有值(表示为None)的内容。
与在java中使用null不同,None实际上是具有各种功能的对象(此处的示例是isDefined)。这使得在对象上组合多个操作变得容易,同时确保如果路上的某些东西没有被定义,那么我们就不会得到空指针异常。
有关选项类型的详细信息,请参阅the scala class documentation或 this stack overflow answer或this stack overflow answer
答案 1 :(得分:0)
当您希望收到Cassandra null值
时,请使用getOption变体_.get[Option[String]]("name")
res8: Option[String] = Some(abc)