我正在尝试在Hive中创建新的UDF。一些UDF只是对Hive中内置UDF的修改。
例如中位数函数写为
select percentile(cast(column as BIGINT), 0.5) from table_name
这意味着,每当我必须计算中位数时,我必须重写上面指定的查询。有没有什么方法可以创建一个新的UDF并将现有的UDF 百分位数包装在java代码中?
如何创建一个新的UDF,它将成为现有内置UDF的包装器?
答案 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)=> {//使用这些参数实现方法})