关于UDT的Spark SQL表达式

时间:2016-01-18 17:45:39

标签: apache-spark apache-spark-sql spark-dataframe

我有一个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我有+ - * /可用于这种类型的操作吗?

1 个答案:

答案 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和/或现有的乘法实现,以便现有算术表达式正确处理

除非*确实是一项艰难的要求,否则我可能会坚持前两项。