UDT 上的 Spark SQL 表达式

Spark SQL Expressions on UDT

我有一个 UDT(用户定义类型)。我想在 Spark SQL 表达式中使用它,例如UDT 名称 * 10.3。我的 UDT 不仅仅是一个简单的数字,它是一个复杂的类型,它有自己的 +-/* 重写函数。我无法用标准的 Scala 类型实现我想要的逻辑。

我尝试在 Spark 1.6.0 的 Spark SQL 表达式中使用它并得到了这个结果:

cannot resolve '(UDTName * 10.0)' due to data type mismatch: differing types in '(udttype * 10.0)' (udttype and double).;

Spark 支持这个操作吗?我可以在表达式中使用 UDT 吗?我应该做什么特别的事情来告诉 Spark SQL 我有适用于这种类型的 +-*/ 操作?

Am I allowed to use UDTs in expressions?

你是,但绝对不是那么简单。每当您在使用 a method defined on a Column which passes your data to arithmetic expression which is defined in org.apache.spark.sql.catalyst.expressions 的表达式中调用 * on 时。如您所料,这些对您的 UDT 一无所知。

在实践中,您可以从三个不同的层面解决这个问题:

  • 忽略表达式,仅使用 UDF 来实现所需的操作。这是最简单的方法,您只需要几个包装器,例如:

    val complexMultiply = udf((x: ComplexNumber, y: Double) => x * y)
    
  • 创建一个可以被 UDF 调用的自定义表达式(我们称之为 ComplexMultiply)。您可以查看例如 Levenshtein distance implementation 了解详细信息

  • 调整您的 UDT 和/或现有的乘法实现,使其由现有的算术表达式正确处理

除非 * 真的是一个硬性要求,否则我可能会坚持使用前两个。