зарегистрировать два udf с одинаковым именем на sparkSession

Во время миграции с Spark 1.6 на Spark 2.2 я столкнулся с проблемой.

Реализация в Spark 1.6 имеет две UDF:

  • Пользовательская функция SparkSQL (реализация org.apache.spark.sql.api.java.UDF2, зарегистрированная через SQLContext.udf().register(…))
  • Пользовательские пользовательские функции Java, разработанные для Hive (реализация org.apache.hadoop.hive.ql.udf.generic.GenericUDTF, зарегистрированная через HiveContext.sql(…))

Обе UDF были зарегистрированы через один контекст с тем же именем foo

пример в java со Spark 1.6:

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?


person Lunna    schedule 07.04.2018    source источник


Ответы (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

Я просто вижу код, надеюсь, это поможет.

person hlagos    schedule 09.04.2018