首页 > 解决方案 > 为什么输入类型 Spark UDF 是结构列的行?它是如何在 Spark 中实现的?

问题描述

对于单列,UDF 的输入类型是该列的数据类型,而对于 struct 列,输入类型是 Row,为什么以及如何实现?

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

val u =  udf((x:Row) => x, sub_schema)

root
 |-- subtable: struct (nullable = true)
 |    |-- col1: array (nullable = true)
 |    |    |-- element: integer (containsNull = false)
 |    |-- col2: string (nullable = true)

StructType / Row 的 Spark UDF

标签: apache-spark

解决方案


推荐阅读