2016-11-15 7 views
6

कुछ कार्यों के निष्पादन के बाद शून्य/सही क्यों है? फिर भी डीएफ में कोई नैन मूल्य नहीं हैं।स्पार्क क्यों कॉलम निरर्थक में बदलते हैं

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 

हालांकि अब, कम से कम एक कॉलम के लिए शून्य है जो पहले झूठा था। इसे कैसे समझाया जा सकता है?

उत्तर

6

स्थिर रूप से टाइप की गई संरचना से Dataset बनाते समय (schema तर्क के आधार पर) स्पार्क nullable संपत्ति निर्धारित करने के लिए नियमों के अपेक्षाकृत सरल सेट का उपयोग करता है।

  • दी प्रकार की वस्तु null हो सकता है तो इसके DataFrame प्रतिनिधित्व nullable है।
  • यदि ऑब्जेक्ट Option[_] है तो उसके DataFrame प्रतिनिधित्व nullableNone के साथ SQL NULL माना जाता है।
  • किसी भी अन्य मामले में इसे nullable के रूप में चिह्नित नहीं किया जाएगा।

के बाद से स्काला Stringjava.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.Intnull नहीं किया जा सकता)।

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

हम डेटा परिभाषा को बदलते हैं करने के लिए:

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

foonullable हो जाएगा (Integerjava.lang.Integer है और बॉक्स्ड पूर्णांक null हो सकता है):

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

यह भी देखें: SPARK-20668शून्यता को संभालने के लिए ScalaUDF संशोधित करें।

संबंधित मुद्दे