代码之家  ›  专栏  ›  技术社区  ›  HISI

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

  •  2
  • HISI  · 技术社区  · 6 年前

    我在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 回复  |  直到 6 年前
        1
  •  2
  •   mahmoud mehdi    6 年前

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

    这里有一个示例,我们将第一行的值设置为空,而此列的Nullable属性设置为假:

    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

    我希望它有帮助。