6

Tôi có khung dữ liệu Spark trong đó một cột là một mảng các số nguyên. Cột là nullable vì nó đến từ một bên ngoài tham gia bên ngoài. Tôi muốn chuyển đổi tất cả các giá trị null vào một mảng trống vì vậy tôi không phải đối phó với nulls sau này.Chuyển đổi giá trị null thành mảng trống trong Spark DataFrame

Tôi nghĩ tôi có thể làm điều đó như vậy:

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

Tuy nhiên, điều này dẫn đến ngoại lệ sau đây:

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) 

Rõ ràng loại mảng không được hỗ trợ bởi các when chức năng. Có cách nào khác dễ dàng để chuyển đổi các giá trị null?

Trong trường hợp đó là có liên quan, đây là lược đồ cho cột này:

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

Hãy xem hàm sql coalesce https://docs.oracle.com/database/121/SQLRF/functions033.htm#SQLRF00617 – gasparms

Trả lời

11

Bạn có thể sử dụng một UDF:

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

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

kết hợp với WHEN hay COALESCE:

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

Đối với mảng chữ, bạn cũng có thể sử dụng array functio n:

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

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

nhưng tiếc là nó sẽ không hoạt động ở đây vì bạn không thể chỉ định loại.

+0

Cảm ơn sự giúp đỡ của bạn. Tôi đã thực sự đã thử một UDF trước nhưng không nghĩ thực sự gọi 'apply' trên nó (tức là tôi đang làm' mảng_' thay vì 'mảng _()'). –

Các vấn đề liên quan