在 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的主要内容,如果未能解决你的问题,请参考以下文章

为什么kryo注册不能在SparkSession中工作?

UNIX Domain Socket(UDS)是什么?同一台主机间进程间通信

dubbo之多注册中心

dubbo应用场景示例四

SparkSession 在本地独立集群上花费的时间太长

合并两个目录,保留任何同名文件