Ich habe eine Spalte "StructType" in Spark Dataframe, die ein Array und eine Zeichenfolge als Unterfelder hat. Ich möchte das Array ändern und die neue Spalte des gleichen Typs zurückgeben. Kann ich es mit UDF verarbeiten? Oder was sind die Alternativen?Spark UDF für StructType/Zeile
import org.apache.spark.sql.types._
import org.apache.spark.sql.Row
val sub_schema = StructType(StructField("col1",ArrayType(IntegerType,false),true) :: StructField("col2",StringType,true)::Nil)
val schema = StructType(StructField("subtable", sub_schema,true) :: Nil)
val data = Seq(Row(Row(Array(1,2),"eb")), Row(Row(Array(3,2,1), "dsf")))
val rd = sc.parallelize(data)
val df = spark.createDataFrame(rd, schema)
df.printSchema
root
|-- subtable: struct (nullable = true)
| |-- col1: array (nullable = true)
| | |-- element: integer (containsNull = false)
| |-- col2: string (nullable = true)
Es scheint, dass ich ein UDF vom Typ Row benötigen, so etwas wie
val u = udf((x:Row) => x)
>> Schema for type org.apache.spark.sql.Row is not supported
Dies macht Sinn, da Funke das Schema für den Rückgabetyp nicht kennt. Leider udf.register nicht zu:
spark.udf.register("foo", (x:Row)=> Row, sub_schema)
<console>:30: error: overloaded method value register with alternatives: ...