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



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

e.g 中值函数写为

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

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

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

您可以使用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)))

因此中位数将是这样的函数:

def median(expr: org.apache.spark.sql.Column): org.apache.spark.sql.Column = {
  callUDF("percentile", expr, lit(0.5))
}
df.select(median($"x"))

您不能使用Nest UDF调用。UDF包装一个在提取值而不是列的函数。

可以从Spark SQL访问所有Hive UDF。您可以在Spark SQL中重新使用UDF,并在其中使用Hive UDF。sqlcontext.udf.register(((x,percentileValue)=> {//使用这些params}实现方法})

相关内容

  • 没有找到相关文章

最新更新