如何为任意类型的数组制作通用 UDF

拉斐尔·罗斯

假设我想制作一个 spark UDF 来反转结构数组的顺序。结构的具体类型应该无关紧要,所以我尝试了:

val reverseUDF = udf((s:Seq[_]) => s.reverse)

但这给

java.lang.UnsupportedOperationException: Schema for type Any is not supported

我还尝试使用泛型方法并强制类型泛型类型参数成为以下类型的子类型Product

def reverse[T <: Product](s:Seq[T]) = {
  s.reverse
}

val reverseUDF = udf(reverse _)

这给出:

scala.MatchError: Nothing (of class scala.reflect.internal.Types$TypeRef$$anon$6)

那么这甚至可能吗?

阿尔珀 t。特克

它不是。Spark 必须知道返回输出类型,并且无法使用 SQL 表达式来确定它。您必须udf为要使用的每种类型定义特定的,例如:

udf(reverse[(String, Int)] _)
udf(reverse[(String, Long, String)] _)

等等。然而,这些在实践中都没有用,因为你永远不会Product在你的 udf 中看到类型。结构类型始终编码为Row- Spark Sql UDF 带有复杂的输入参数

如果您使用 Spark 2.3,您可以将任意表达reverse为:

import org.apache.spark.sql.Row
import org.apache.spark.sql.types.DataType

def reverse(schema: DataType) = udf(
  (xs: Seq[Row]) => xs.map(x => Row.fromSeq(x.toSeq.reverse)),
  schema
)

但您必须为每个实例提供架构:

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

对UDF使用数组求和

来自分类Dev

如何为Snowflake SQL UDF指定任何类型

来自分类Dev

如何优化此UDF

来自分类Dev

如何打开UDF卷

来自分类Dev

如何打开UDF卷

来自分类Dev

如何使用Scala调用UDF

来自分类Dev

使用通用类型和额外参数定义 UDF

来自分类Dev

UDF制作一种替代数组功能

来自分类Dev

跨通用UDF Hive保存状态

来自分类Dev

如何为数据框中的复杂列创建包含数组(案例类)的 udf

来自分类Dev

如何制作在单列上运行的可重用UDF?

来自分类Dev

U-SQL-如何为慢速UDF增加parallelizm

来自分类Dev

pyspark中UDF的返回类型无效

来自分类Dev

Presto Udf 中的返回行类型

来自分类Dev

SQL UDF返回日期数组

来自分类Dev

Teradata Aggregate UDF中的数组定义

来自分类Dev

如何从函数(UDF)返回表变量?

来自分类Dev

如何在Tajo中编写UDF

来自分类Dev

如何在Scala中编写Pig UDF

来自分类Dev

如何设置PythonPath / UDF_Modules?

来自分类Dev

pyspark如何使用两列编写UDF

来自分类Dev

MySQL如何加快查询中的UDF

来自分类Dev

如何在AS400中创建UDF

来自分类Dev

如何在 Redshift(亚马逊)中更新 UDF?

来自分类Dev

如何在PySpark的UDF中返回“元组类型”?

来自分类Dev

如何使用udf更新包含数组的spark dataframe列

来自分类Dev

在Excel中使用正则表达式的通用UDF

来自分类Dev

Spark UDF错误-不支持类型为Any的架构

来自分类Dev

Pyspark UDF-复杂返回类型的性能下降