【问题标题】: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|
    // +------+
    

    【讨论】:

    • 两者都可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 2017-11-27
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    相关资源
    最近更新 更多