在从 Spark 1.6 迁移到 Spark 2.2 的过程中,我遇到了这个问题。
Spark 1.6 上的实现有两个 UDF:
- SparkSQL UDF(通过 SQLContext.udf().register(…) 注册的 org.apache.spark.sql.api.java.UDF2 的实现)
- 为 Hive 设计的 Java 自定义 UDF(通过 HiveContext.sql(…) 注册的 org.apache.hadoop.hive.ql.udf.generic.GenericUDTF 的实现)
两个 UDF 均通过一个具有相同名称 foo 的上下文注册
使用 Spark 1.6 的 Java 示例:
public static void register(SQLContext sqlContext) {
sqlContext.udf().register("foo", new Foo(), DataTypes.StringType);
if (sqlContext instanceof HiveContext) {
HiveContext hiveContext = (HiveContext) sqlContext;
hiveContext.sql(
"create temporary function foo as 'com.FooHive'");
}
}
我尝试在 SparkSession (Spark 2.2) 上执行相同的操作:
public static void register(SparkSession sparkSession) {
sparkSession.udf().register("foo", new Foo(), DataTypes.StringType);
sparkSession.sql(
"create temporary function foo as 'com.FooHive'");
}
此代码导致异常:
org.apache.spark.sql.AnalysisException: Function foo already exists;
有办法解决 SparkSession 上的这个问题吗?
最佳答案
看来 Spark 2.3 中的临时功能已经解决了这个问题。如果您在分支 2.2 中看到正在使用 registerFunction
但在 2.3 中,他们将其更改为 createOrReplaceTempFunction
这只是查看代码,希望对您有所帮助。
关于java - 在sparkSession上注册两个同名的udf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49711169/