【问题标题】:Spark SQL Expressions on UDTUDT 上的 Spark SQL 表达式
【发布时间】:2016-01-20 17:28:13
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案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 和/或现有的乘法实现,使其能够被现有的算术表达式正确处理

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

    【讨论】:

    • 感谢您的回复。我们已经尝试过UDF,它们工作得很好。使用表达式对解决方案非常有益,但我们必须考虑工作量。
    • “调整你的 UDT 和/或现有的乘法实现,以便现有的算术表达式能正确处理它”——这就是我希望做的。您对所涉及的内容有一个粗略的了解吗?
    • 说实话,我不确定这是否值得大惊小怪。虽然创建自定义表达式并不是特别难,并且您可以通过示例轻松处理这个问题,但我不确定是否可以在不修改内置实现的情况下让 * 工作,至少对我来说这是一个巨大的权衡。
    • 我打算在有空的时候看看这个,如果有什么我会告诉你的。
    猜你喜欢
    • 2019-05-13
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 2020-05-22
    • 2019-05-30
    • 1970-01-01
    • 2018-05-17
    • 2020-05-25
    相关资源
    最近更新 更多