我有一个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 SQL我有+ - * /可用于这种类型的操作吗?
答案 0 :(得分: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和/或现有的乘法实现,以便现有算术表达式正确处理
除非*
确实是一项艰难的要求,否则我可能会坚持前两项。