首页 文章

关于UDT的Spark SQL表达式

提问于
浏览
2

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

我尝试在Spark 1.6.0中的Spark SQL表达式中使用它并获得此结果:

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

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

1 回答

  • 1

    我可以在表达式中使用UDT吗?

    你是,但绝对不是那么简单 . 每当在表达式中调用 * 时,您正在使用a method defined on a Column将数据传递给org.apache.spark.sql.catalyst.expressions中定义的算术表达式 . 正如您所料,这些对您的UDT一无所知 .

    在实践中,您可以在三个不同的级别处理此问题:

    • 忽略表达式并仅使用UDF来实现所需的操作 . 这是最简单的方法,你只需要几个包装器,如:
    val complexMultiply = udf((x: ComplexNumber, y: Double) => x * y)
    
    • 创建一个可由UDF调用的自定义表达式(让我们称之为 ComplexMultiply ) . 有关详细信息,请查看Levenshtein distance implementation

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

    除非 * 真的是一个很难的要求,否则我可能会坚持前两个 .

相关问题