6

Ho un frame di dati Spark in cui una colonna è una matrice di numeri interi. La colonna è nullable perché proviene da un join esterno sinistro. Voglio convertire tutti i valori null in una matrice vuota, quindi non devo occuparmi di null in seguito.Converti i valori nulli nell'array vuoto in Spark DataFrame

Pensavo di poter fare in questo modo:

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

Tuttavia, questo si traduce nella seguente eccezione:

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) 

Apparentemente tipi di matrice non sono supportati dalla funzione when. C'è un altro modo semplice per convertire i valori nulli?

Nel caso in cui è rilevante, qui è lo schema per questa colonna:

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

Dai un'occhiata alla funzione coalesce sql https://docs.oracle.com/database/121/SQLRF/functions033.htm#SQLRF00617 – gasparms

risposta

11

È possibile utilizzare un UDF:

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

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

combinato con WHEN o COALESCE:

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

Per i letterali di array è anche possibile utilizzare la funzione array n:

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

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

ma purtroppo non funzionerà qui poiché non è possibile specificare il tipo.

+0

Grazie per il tuo aiuto. In realtà avevo già provato un UDF ma non pensavo di chiamare effettivamente 'apply' su di esso (cioè stavo facendo' array_' invece di 'array _()'). –