【问题标题】:define function of numeric types SparkSQL scala定义数字类型的函数 SparkSQL scala
【发布时间】:2016-06-24 23:49:41
【问题描述】:
我已经定义了以下函数来注册为 UDF SparkSQL:
def array_sum(x: WrappedArray[Long]): Long= {
x.sum
}
我希望这个函数适用于任何作为参数接收的数字类型。我尝试了以下方法:
import Numeric.Implicits._
import scala.reflect.ClassTag
def array_sum(x: WrappedArray[NumericType]) = {
x.sum
}
但它不起作用。有任何想法吗?谢谢!
【问题讨论】:
标签:
scala
types
apache-spark
user-defined-functions
implicit-conversion
【解决方案1】:
NumericType 是特定于 Spark SQL 的,不会暴露给接收标准 Scala 对象的 UDF。所以很可能你想要这样的东西:
def array_sum[T : Numeric : ClassTag](x: Seq[T]) = x.sum
udf[Double, Seq[Double]](array_sum _)
虽然看起来在这里没有什么收获。要以正确的方式构建这样的东西,您可能应该实现自定义表达式。
示例用法:
val rddDouble: RDD[(Long, Array[Double])] = sc.parallelize(Seq(1L, Array(1.0, 2.0)
val double_array_sum = udf[Double, Seq[Double]](array_sum _)
rddDouble.toDF("k", "v").select(double_array_sum($"v")).show
// +------+
// |UDF(v)|
// +------+
// | 3.0|
// +------+
val rddFloat: RDD[(Long, Array[Float])] = sc.parallelize(Seq(
(1L, Array(1.0f, 2.0f))
))
val float_array_sum = udf[Float, Seq[Float]](array_sum _)
rddFloat.toDF("k", "v").select(float_array_sum($"v")).show
// +------+
// |UDF(v)|
// +------+
// | 3.0|
// +------+