在 sparkSession 上注册两个同名 udf
Posted
技术标签:
【中文标题】在 sparkSession 上注册两个同名 udf【英文标题】:register two udfs with the same name on sparkSession 【发布时间】:2018-09-17 13:36:10 【问题描述】:在从 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 上解决这个问题?
【问题讨论】:
【参考方案1】:看起来这已在 Spark 2.3 中解决了临时功能。如果您在分支中看到 2.2 正在使用 registerFunction
https://github.com/apache/spark/blob/branch-2.2/sql/core/src/main/scala/org/apache/spark/sql/UDFRegistration.scala
但在 2.3 中,他们将其更改为 createOrReplaceTempFunction
https://github.com/apache/spark/blob/branch-2.3/sql/core/src/main/scala/org/apache/spark/sql/UDFRegistration.scala
这只是看代码,希望对你有帮助。
【讨论】:
以上是关于在 sparkSession 上注册两个同名 udf的主要内容,如果未能解决你的问题,请参考以下文章