如何使用Hive中的现有内置UDF编写包装器?

时间:2016-06-22 00:02:42

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

我正在尝试在Hive中创建新的UDF。一些UDF只是对Hive中内置UDF的修改。

例如中位数函数写为

select percentile(cast(column as BIGINT), 0.5) from table_name

这意味着,每当我必须计算中位数时,我必须重写上面指定的查询。有没有什么方法可以创建一个新的UDF并将现有的UDF 百分位数包装在java代码中?

如何创建一个新的UDF,它将成为现有内置UDF的包装器?

2 个答案:

答案 0 :(得分:3)

您可以使用www.mydomain.com/mysite功能:

callUDF

所以中位数就是这样的函数:

import org.apache.spark.sql.functions.{callUDF, lit}

val df = Seq((1L, 3L), (2L, 5L), (3L, 4L)).toDF("id", "x")
df.select(callUDF("percentile", $"x", lit(0.5)))

但您不能使用嵌套UDF调用。 UDF包装一个函数,该函数对提取的值而不是列进行操作。

答案 1 :(得分:0)

可以从spark sql访问所有hive udfs。您可以在spark sql中重新拥有自己的udf并使用其中的hive udf。 sqlContext.udf.register((x,percentileValue)=> {//使用这些参数实现方法})