2016-11-15 5 views
6

Почему nullable = true после выполнения некоторых функций? Тем не менее в df нет значений nan.искра почему столбцы меняются на nullable true

val myDf = Seq((2,"A"),(2,"B"),(1,"C")) 
     .toDF("foo","bar") 
     .withColumn("foo", 'foo.cast("Int")) 

myDf.withColumn("foo_2", when($"foo" === 2 , 1).otherwise(0)).select("foo", "foo_2").show 

когда df.printSchema теперь называется обнуляемым будет ложным для обеих колонок.

val foo: (Int => String) = (t: Int) => { 
    fooMap.get(t) match { 
     case Some(tt) => tt 
     case None => "notFound" 
    } 
    } 

val fooMap = Map(
    1 -> "small", 
    2 -> "big" 
) 
val fooUDF = udf(foo) 

myDf 
    .withColumn("foo", fooUDF(col("foo"))) 
    .withColumn("foo_2", when($"foo" === 2 , 1).otherwise(0)).select("foo", "foo_2") 
    .select("foo", "foo_2") 
    .printSchema 

Однако теперь значение nullable истинно для хотя бы одного столбца, который раньше был ложным. Как это можно объяснить?

ответ

6

При создании Dataset из статически типизированной структуры (в зависимости от аргумента schema) Spark использует относительно простой набор правил для определения свойства nullable.

  • Если объект данного типа может быть null то его DataFrame представление nullable.
  • Если объект является Option[_], то его DataFrame представляет собой nullable с None считается SQL NULL.
  • В любом другом случае он будет помечен как не nullable.

Так Скала String является java.lang.String, который может быть null, генерируемый столбец может это nullable. По той же причине bar столбец в исходном наборе данных nullable:

val data1 = Seq[(Int, String)]((2, "A"), (2, "B"), (1, "C")) 
val df1 = data1.toDF("foo", "bar") 
df1.schema("bar").nullable 
Boolean = true 

но foo не является (scala.Int не может быть null).

df1.schema("foo").nullable 
Boolean = false 

Если изменить определение данных для:

val data2 = Seq[(Integer, String)]((2, "A"), (2, "B"), (1, "C")) 

foo будет nullable (Integer является java.lang.Integer и штучное целым число может быть null):

data2.toDF("foo", "bar").schema("foo").nullable 
Boolean = true 

См. Также: SPARK-20668Изменить ScalaUDF для обработки недействительности.

 Смежные вопросы

  • Нет связанных вопросов^_^