UDF 的输入类型应该是啥类型的列 - StructType 数组或“null”?

Posted

技术标签:

【中文标题】UDF 的输入类型应该是啥类型的列 - StructType 数组或“null”?【英文标题】:What should be the input type for a UDF taking in columns of type - Array of StructType or "null"?UDF 的输入类型应该是什么类型的列 - StructType 数组或“null”? 【发布时间】:2019-11-10 18:36:29 【问题描述】:

我的 DataFrame 的架构如下:

root
 |-- col1: string (nullable = true)
 |-- col2: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- unit1: string (nullable = true)
 |    |    |-- sum(unit2): string (nullable = true)
 |    |    |-- max(unit3): string (nullable = true)
 |-- col3: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- unit1: string (nullable = true)
 |    |    |-- sum(unit2): string (nullable = true)
 |    |    |-- max(unit3): string (nullable = true)

我正在 scala 中编写一个 UDF,它接受 cols - col2 和 col3。 考虑到 col2 的值可以是 "null"

,我传递给 UDF 的每一列的输入类型应该是什么
val process_stuff = udf((col2: ???, col3: ??? ) => 

到目前为止,我已经尝试过这个和我的其他东西

val process_stuff = udf((col2:ArrayType[StructType[StructField]], col3:ArrayType[StructType[StructField]]) => 

但它在这里和那里给我警告 请帮忙!

【问题讨论】:

【参考方案1】:

您的 UDF 应具有以下签名:

val process_stuff = udf((col2: Seq[Row], col3: Seq[Row]) => ...)

【讨论】:

不起作用。在 UDF 中,当我访问 unit1 时出现类型不匹配错误:说“找到:任何,需要:字符串” 尝试将 Seq[Row] 替换为 Seq[String] 它应该可以工作。

以上是关于UDF 的输入类型应该是啥类型的列 - StructType 数组或“null”?的主要内容,如果未能解决你的问题,请参考以下文章

在将 .toArray() 用于 Spark 向量之后,它应该是啥类型?

在 Spark 数据帧 udf 中,像 struct(col1,col2) 这样的函数参数的类型是啥?

PySpark UDF,输入端只有 None 值

作为组件的输入变量的类型应该是啥 - Angular

pyspark 在 udf 中获取结构数据类型的字段名称

Scala UDF 返回“不支持单元类型的架构”