【发布时间】:2017-08-13 09:29:27
【问题描述】:
我在 spark Dataframe 中有一个“StructType”列,其中包含一个数组和一个字符串作为子字段。我想修改数组并返回相同类型的新列。我可以用 UDF 处理它吗?或者有什么替代方案?
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)
看来我需要一个 Row 类型的 UDF,类似于
val u = udf((x:Row) => x)
>> Schema for type org.apache.spark.sql.Row is not supported
这是有道理的,因为 Spark 不知道返回类型的架构。 不幸的是,udf.register 也失败了:
spark.udf.register("foo", (x:Row)=> Row, sub_schema)
<console>:30: error: overloaded method value register with alternatives: ...
【问题讨论】:
-
为什么 Row 类型的 UDF 可以工作? Spark的UDF类型是如何推断的?
标签: scala apache-spark udf