我应该将nullable设置为false还是true?

时间:2018-07-24 15:50:41

标签: scala apache-spark dataframe

我在spark中有一个数据框,但我不了解nullable属性的含义,应该将其设置为false还是true:

例如:

root
 |-- user_id: long (nullable = true)
 |-- event_id: long (nullable = true)
 |-- invited: integer (nullable = true)
 |-- day_diff: long (nullable = true)
 |-- interested: integer (nullable = false)
 |-- event_owner: long (nullable = true)
 |-- friend_id: long (nullable = true)

1 个答案:

答案 0 :(得分:2)

Nullable指示相关列是否可以为null。 这样可以确保特定的列不能为null(如果nullable属性设置为true时为null,Spark将在对数据帧的第一个操作期间启动java.lang.RuntimeException。)

这里是一个示例,其中我们将第一行的值设置为null,而此列的nullable属性设置为false:

import org.apache.spark.sql._
import org.apache.spark.sql.types._
val data = Seq(
  Row(null, "a"),
  Row(5, "z")
)

val schema = StructType(
 List(
   StructField("num", IntegerType, false),
   StructField("letter", StringType, true)
 )
)

val df = spark.createDataFrame(
 spark.sparkContext.parallelize(data),
 schema
)
df.show()

然后您将遇到以下异常,即num列不能为空值:

java.lang.RuntimeException: Error while encoding: java.lang.RuntimeException: The 0th field 'num' of input row cannot be null.

PS:可为空的值默认情况下设置为true,您不必仅在希望它为false时才设置它。

https://github.com/apache/spark/blob/3d5c61e5fd24f07302e39b5d61294da79aa0c2f9/sql/catalyst/src/main/scala/org/apache/spark/sql/types/StructField.scala#L39

我希望对您有帮助