从我所看到的,为了做到这一点,你必须
udf
设为普通函数使用SQLContext
为SQL
spark.sqlContext.udf.register("myUDF", myFunc)
将其转换为UserDefinedFunction
DataFrame
def myUDF = udf(myFunc)
是否无法将此功能合并为一步并使udf
可用于两者?另外,对于DataFrame
但不存在SQL的函数的情况,如何在不复制代码的情况下注册它?
答案 0 :(得分:12)
var returnedJSON = JSON.parse('[{"name": "jason"}, {"name": "jake"}, {"name": "jill"}]');
var filteredResults = returnedJSON.filter((item) => {
return item.name === "jason"
});
console.log(filteredResults); // returns {name:"jason"}
的 UDFRegistration.register
变体返回scala.FunctionN
,因此您可以在一个步骤中注册SQL函数并创建DSL友好UDF:
UserDefinedFunction
val timesTwoUDF = spark.udf.register("timesTwo", (x: Int) => x * 2)
spark.sql("SELECT timesTwo(1)").show
+---------------+
|UDF:timesTwo(1)|
+---------------+
| 2|
+---------------+
spark.range(1, 2).toDF("x").select(timesTwoUDF($"x")).show
答案 1 :(得分:3)
您可以使用以下内容并仍将其应用于数据框
spark.sqlContext.udf.register("myUDF", myFunc)
在数据帧转换时调用selectExpr。
df.selectExpr("myUDF(col1) as modified_col1")
答案 2 :(得分:1)
Spark2更新-
spark.udf.register(“ func_name”,func_name)
参数1-函数名称将在spark中注册
Argument2-函数名称在python / scala中创建时定义的内容
最佳做法是在spark中注册具有相同名称的函数。