2016-11-15 15 views
6

dlaczego jest pusta = true po wykonaniu niektórych funkcji? Nadal nie ma wartości nan w df.iskrzenie dlaczego kolumny zmieniają się na wartości zerowe 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 

gdy df.printSchema nazywa się teraz pustych będzie false dla obu kolumnach.

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 

Jednak teraz wartość zerowa jest prawdziwa dla co najmniej jednej kolumny, która wcześniej była fałszywa. Jak to wyjaśnić?

Odpowiedz

6

Podczas tworzenia Dataset ze statycznie wpisanej struktury (bez zależności od argumentu schema) Spark używa względnie prostego zestawu reguł do określenia właściwości nullable.

  • Jeśli przedmiotem danego typu może być null następnie jego DataFrame reprezentacja jest nullable.
  • Jeśli obiektem jest Option[_], wówczas jego reprezentacja DataFrame to nullable z None uważana za SQL NULL.
  • W każdym innym przypadku będzie oznaczony jako nie nullable.

Ponieważ Scala String jest java.lang.String, które mogą być null generowane kolumny nie jest nullable. Z tego samego powodu bar kolumna nullable w pierwszym zestawie danych:

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

ale foo nie jest (scala.Int nie może być null).

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

Jeśli zmienimy definicję danych do:

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

foo będzie nullable (Integer jest java.lang.Integer i pudełkowej całkowita może być null):

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

Zobacz też: SPARK-20668Zmodyfikuj ScalaUDF do obsługi opcji nullability.

Powiązane problemy