在 UDT 上激发 SQL 表达式



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

我尝试在Spark 1.6.0的Spark SQL表达式中使用它,并得到以下结果:

由于数据类型不匹配,无法解析"(UDTName * 10.0)":(udttype * 10.0)"(udttype * 10.0)"(udttype 和 double)中的不同类型。

Spark 是否支持此操作? 是否可以在表达式中使用 UDT? 我应该做些什么来告诉 Spark SQL 我有适用于此类型的 +-*/操作吗?

是否可以在表达式中使用 UDT?

你是,但绝对没有那么简单。每当在表达式中调用 * on 时,您都在使用在Column上定义的方法,该方法将数据传递给 org.apache.spark.sql.catalyst.expressions 中定义的算术表达式。正如您所期望的那样,这些人对您的 UDT 一无所知。

在实践中,您可以在三个不同的级别上解决此问题:

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

    val complexMultiply = udf((x: ComplexNumber, y: Double) => x * y)
    
  • 创建一个自定义表达式(我们称之为 ComplexMultiply ),它可以被 UDF 调用。例如,您可以检查列文施泰因距离实现以获取详细信息

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

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

相关内容

  • 没有找到相关文章

最新更新