Spark / Scala:字符串字段可以为空,但双字段不可为空[重复]

Posted

技术标签:

【中文标题】Spark / Scala:字符串字段可以为空,但双字段不可为空[重复]【英文标题】:Spark/Scala : String field is nullable , but a Double field is non-nullable [duplicate] 【发布时间】:2018-02-04 06:38:56 【问题描述】:

我正在尝试使用案例类从 RDD 创建一个 DataFrame

我观察到字符串字段显示为可空,而双字段不可为空。

请帮助我理解这种行为

PS:我知道可以通过将其声明为 Option[Double] 来使该字段为空,但我想了解为什么会这样?

scala> case class Airport(uuid:String, timestamp:String, iata:String, airport:String, city:String, state:String, country:String, lat:Double, long:Double)

scala> val ap_df = ap_nohdr.map(r => Airport(r(0).trim, r(1).trim, r(2).trim, r(3).trim, r(4).trim, r(5).trim, r(6).trim, r(7).trim.toDouble, r(8).trim.toDouble)).toDF();

scala> ap_df.printSchema
root
 |-- uuid: string (nullable = true)
 |-- timestamp: string (nullable = true)
 |-- iata: string (nullable = true)
 |-- airport: string (nullable = true)
 |-- city: string (nullable = true)
 |-- state: string (nullable = true)
 |-- country: string (nullable = true)
 |-- lat: double (nullable = false)
 |-- long: double (nullable = false)

【问题讨论】:

请显示ap_nohdr 的定义并解释为什么您不只是将其作为数据集阅读。例如,使用 CSV 阅读器 @cricket_007,谢谢您的建议,我知道使用 csv 阅读器直接加载它。这里我正在尝试使用 RDD 方式。目的是学习和理解 Spark 和 Scala 提供的所有细微差别 双精度数是一个数字。数字不能为空...这是您要找的吗? @cricket_007,是的,在那些行中..为什么可以为空字符串和不能为空的双精度..根据我的理解,两者都是 scala 对象? (或者不是吗??,是原始人吗?) 【参考方案1】:

Scala String,就像 Java 中的那样,是一个对象。可以为空。

Scala Double 是 Java 原语 double 的别名。与java.lang.Double 相比,它不是可为空的对象(欢迎您在案例类中使用)

你也可以参考 Scala 文档中关于 Null 对象的这一部分,它也适用于 Doubles

由于 Null 不是值类型的子类型,因此 null 不是任何此类类型的成员。例如,不能将 null 分配给 scala.Int 类型的变量。

正如您所发现的,Option 类是您指示“可空原语”的方式

scala: assign null to primitive

【讨论】:

以上是关于Spark / Scala:字符串字段可以为空,但双字段不可为空[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串中带有双引号的json文件加载到spark scala中的数据框中

参数为空时,Spark Scala UDF 不返回预期值

spark scala数据框中所有列的值都为空

当结构中的所有值都为空时,如何在 Scala spark 中使结构为空?

Spark 作业中的 Scala 成员字段可见性

scala spark dataframe 修改字段类型