Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark UDT上的Spark SQL表达式_Apache Spark_Apache Spark Sql_Spark Dataframe - Fatal编程技术网

Apache spark UDT上的Spark SQL表达式

Apache spark UDT上的Spark SQL表达式,apache-spark,apache-spark-sql,spark-dataframe,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和double)中的类型不同 Spark支持此操作吗?我可以在表达式中使用UDT吗?我应该做些什么来告诉Spark SQ

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

我尝试在Spark 1.6.0中的Spark SQL表达式中使用它,结果如下:

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

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

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

是的,但绝对不是那么简单。无论何时在所使用的表达式中调用
*
,该表达式将数据传递到中定义的算术表达式。正如你所料,这些人对你的UDT一无所知

在实践中,您可以从三个不同的层面来解决此问题:

  • 忽略表达式,仅使用UDF实现所需的操作。这是最简单的方法,您只需要几个包装器,如:

    val complexMultiply = udf((x: ComplexNumber, y: Double) => x * y)
    
  • 创建一个自定义表达式(我们称之为ComplexMultiply),它可以被UDF调用。例如,您可以查看详细信息


  • 调整UDT和/或现有乘法实现,使其由现有算术表达式正确处理


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

谢谢您的回复。我们已经尝试过UDF,它们工作得很好。使用表达式对解决方案非常有益,但我们必须考虑到工作水平。“调整UDT和/或现有乘法实现,使其由现有算术表达式正确处理”-这就是我希望做的。你大概知道会涉及到什么吗?说实话,我不确定是否值得大惊小怪。虽然创建自定义表达式并不特别困难,而且您可以通过示例轻松处理此问题,但我不确定是否可以在不修改内置实现的情况下使用
*
,至少对我来说,这是一个巨大的折衷。我计划在有空闲时间的时候看看这一点,如果我认为出了什么事。