6

Mam ramkę danych Spark, w której jedna kolumna jest tablicą liczb całkowitych. Kolumna jest zerowalna, ponieważ pochodzi z lewego sprzężenia zewnętrznego. Chcę przekonwertować wszystkie wartości null do pustej tablicy, więc nie mam do czynienia z wartościami null później.Konwertuj wartości puste na pustą tablicę w Spark DataFrame

Myślałem, że mogę to zrobić tak:

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

Powoduje to jednak w następującym wyjątkiem:

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) 

Widocznie typy tablicy nie są obsługiwane przez funkcję when. Czy istnieje inny łatwy sposób na konwersję wartości pustych?

W przypadku istotne jest, tutaj jest schemat dla tej kolumny:

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

Spójrz na funkcję koalesce sql https://docs.oracle.com/database/121/SQLRF/functions033.htm#SQLRF00617 – gasparms

Odpowiedz

11

Można użyć UDF:

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

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

połączeniu z WHEN lub COALESCE:

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

W przypadku literałów tablicowych można również użyć funkcji array n:

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

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

ale niestety tutaj nie zadziała, ponieważ nie można określić typu.

+0

Dzięki za pomoc. Próbowałem wcześniej UDF, ale nie myślałem, aby wywołać 'apply' na nim (tj. Robiłem' array_' zamiast 'array _()'). –