【问题标题】:Spark SQL function any typeSpark SQL 函数任何类型
【发布时间】:2016-03-15 23:28:06
【问题描述】:

我不能设计一个函数来做任何数字类型:

def array_add_Int(x: WrappedArray[Int], y: WrappedArray[Int]): WrappedArray[Int] = {
    require(x.length == y.length, "ERROR:  cannot operate on arrays of different ranges of dimensions.")    
    x.zipAll(y,0,0).map(pair=>pair._1+pair._2)
}

def array_add_Long(x: WrappedArray[Long], y: WrappedArray[Long]): WrappedArray[Long] = {
    require(x.length == y.length, "ERROR:  cannot operate on arrays of different ranges of dimensions.")    
    x.zipAll(y,0,0).map(pair => pair._1.asInstanceOf[Number].longValue() + pair._2.asInstanceOf[Number].longValue())
}

我尝试附加两个函数的返回如下:

 def array_add[T](itemX:Traversable[T], itemY:Traversable[T])(implicit n:Numeric[T]) = {
    require(itemX.size == itemY.size, "ERROR:  cannot operate on arrays of different ranges of dimensions.")
    itemX.toSeq.zipAll(itemY.toSeq, 0, 0).map(pair => pair._1 + pair._2)
 }

它只适用于 Int 类型。有什么想法吗?

【问题讨论】:

  • 附带说明,这与 spark 或 udfs 没有任何关系。这只是一个普通的 Scala 问题。
  • @AngeloGenovese 我认为它确实如此。这只是从here 开始的一系列问题的一部分。
  • 可能,我对这个世界不是很熟悉。我想创建此功能以在 SQL Spark 中注册,但它不起作用。
  • @zero323 可能是他打算在 Spark 中使用这个函数来定义一个 UDF,但是当他问这个问题时,他似乎遇到的直接问题是 base Scala。

标签: scala apache-spark user-defined-functions apache-spark-sql


【解决方案1】:

您需要使用您要求的 Numeric 类型类作为隐式参数:

def array_add[T](itemX:Traversable[T], itemY:Traversable[T])(implicit n:Numeric[T]) = {
  require(itemX.size == itemY.size, "ERROR:  cannot operate on arrays of different ranges of dimensions.")
  itemX.toSeq.zipAll(itemY.toSeq, n.zero, n.zero).map(pair => n.plus(pair._1, pair._2) )
}

注意,您可以使用n.fromInt() 代替n.zero 来处理0 以外的值

【讨论】:

  • com.migracionmadlib.UDFSparkSQL.MADlib$$anonfun$2 无法转换为 scala.Function1
  • 通过使用此函数并在 SparkSQL 中注册,我得到以下异常
  • com.migracionmadlib 是你自己的包吗?堆栈跟踪中与此错误相关的代码行是什么?
  • 查看 UDFRegistration 的 Scala 文档,我看不到任何注册跨多种类型的 UDF 的方法。您尚未提供您正在执行的注册的代码,但您可能必须为您想要支持的每种类型注册 UDF。 spark.apache.org/docs/latest/api/java/org/apache/spark/sql/…
  • @AngeloGenovese 你是对的,这是不可能的。它需要实现 SQL 表达式而不是 UDF。
猜你喜欢
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 2021-11-15
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
相关资源
最近更新 更多