6

私は1つの列が整数の配列であるSparkデータフレームを持っています。列は、左外部結合から来ているため、NULL可能です。すべてのnull値を空の配列に変換したいので、後でnullを処理する必要はありません。Spark DataFrameでnull値を空の配列に変換します

が、私はそうのようにそれを行うことができると思った:

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機能によってサポートされていません。 null値を変換する他の簡単な方法はありますか?

それはここで、関連性がある場合、この列のスキーマです:

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

coalesce sql関数を参照してください。https://docs.oracle.com/database/121/SQLRF/functions033.htm#SQLRF00617 – gasparms

答えて

11

あなたはUDFを使用することができます。

WHENまたは COALESCEと組み合わせ
import org.apache.spark.sql.functions.udf 

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

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

ありがとうございました。実際にはUDFを試してみましたが、実際に 'apply'を呼び出すとは思っていませんでした(つまり' array _() 'ではなく 'array_'を実行していました)。 –

関連する問題