我有一个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 回答
你是,但绝对不是那么简单 . 每当在表达式中调用
*
时,您正在使用a method defined on a Column将数据传递给org.apache.spark.sql.catalyst.expressions中定义的算术表达式 . 正如您所料,这些对您的UDT一无所知 .在实践中,您可以在三个不同的级别处理此问题:
创建一个可由UDF调用的自定义表达式(让我们称之为
ComplexMultiply
) . 有关详细信息,请查看Levenshtein distance implementation调整您的UDT和/或现有的乘法实现,以便现有的算术表达式正确处理它
除非
*
真的是一个很难的要求,否则我可能会坚持前两个 .