java - 在sparkSession上注册两个同名的udf

标签 java apache-spark hive user-defined-functions apache-spark-2.0

在从 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

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

这只是查看代码,希望对您有所帮助。

关于java - 在sparkSession上注册两个同名的udf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49711169/

相关文章:

hadoop - 快速HDFS和Hive数据复制

hadoop - 如何对 hive 中的每个组进行采样?

java - 忽略整个字符串模式的大小写

apache-spark - Spark独立安装无法连接到master

apache-spark - Spark SQL - gzip 与 snappy 与 lzo 压缩格式之间的区别

hadoop - 为什么有人会在 Tez 上运行 Spark/Flink?

hadoop - 基于 Web 的可视化工具直接从 hive 中提取大型数据集

Java 等价于 scala.collection.mutable.Map.getOrElseUpdate

Java 多线程——真实世界的用例

java - JFrame页面授权登录后如何进入下一个JPanel页面?