6

में शून्य मानों को खाली सरणी में कनवर्ट करें मेरे पास स्पार्क डेटा फ्रेम है जहां एक कॉलम पूर्णांक की सरणी है। कॉलम शून्य है क्योंकि यह बाएं बाहरी जुड़ने से आ रहा है। मैं सभी शून्य मानों को एक खाली सरणी में परिवर्तित करना चाहता हूं इसलिए मुझे बाद में नल से निपटने की ज़रूरत नहीं है।स्पार्क डेटाफ्रेम

मैंने सोचा कि मैं यह इतना की तरह कर सकता है:

val myCol = df("myCol") 
df.withColumn("myCol", when(myCol.isNull, Array[Int]()).otherwise(myCol)) 

बहरहाल, यह निम्न अपवाद में परिणाम:

java.lang.RuntimeException: Unsupported literal type class [I [[email protected] 
at org.apache.spark.sql.catalyst.expressions.Literal$.apply(literals.scala:49) 
at org.apache.spark.sql.functions$.lit(functions.scala:89) 
at org.apache.spark.sql.functions$.when(functions.scala:778) 

जाहिर सरणी प्रकार when समारोह द्वारा समर्थित नहीं हैं। शून्य मूल्यों को बदलने के लिए कोई और आसान तरीका है?

|-- myCol: array (nullable = true) 
| |-- element: integer (containsNull = false) 
+1

coalesce sql फ़ंक्शन https://docs.oracle.com/database/121/SQLRF/functions033.htm#SQLRF00617 – gasparms

उत्तर

11

आप एक यूडीएफ का उपयोग कर सकते हैं::

import org.apache.spark.sql.functions.udf 

val array_ = udf(() => Array.empty[Int]) 

WHEN या COALESCE के साथ संयुक्त:

df.withColumn("myCol", when(myCol.isNull, array_()).otherwise(myCol)) 
df.withColumn("myCol", coalesce(myCol, array_())).show 

मामले में यह प्रासंगिक है, यहाँ इस स्तंभ के लिए स्कीमा है

सरणी अक्षरों के लिए आप array functio का भी उपयोग कर सकते हैं n:

import org.apache.spark.sql.functions.{array, lit} 

df.withColumn("foo", array(lit(1), lit(2))) 

लेकिन दुर्भाग्य से यह यहां काम नहीं करेगा क्योंकि आप इस प्रकार को निर्दिष्ट नहीं कर सकते हैं।

+0

आपकी सहायता के लिए धन्यवाद पर एक नज़र डालें। मैंने वास्तव में पहले एक यूडीएफ की कोशिश की थी लेकिन वास्तव में इसे 'लागू' करने के लिए नहीं सोचा था (यानी मैं 'सरणी _() 'के बजाय' array_' कर रहा था)। –

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