我正在尝试在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}实现方法})