Во время миграции с 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?