1

Мне нужно зарегистрировать функцию udf без аргументов. Но Apache Spark не реализует интерфейс UDF0. пытаюсь somethig как:Как зарегистрировать UDF без аргументов в Apache Spark по Java

UDF1<Object, String> my_func = o -> return "some_generated_string"; 
sqlContext.udf().register("my_func", my_func, DataTypes.StringType); 

Но df.withColumns("newCol", functions.expr("concat(col1, my_funct())")); возвращает исключения org.apache.spark.sql.UDFRegistration$$anonfun$register$25$$anonfun$apply$1 cannot be cast to scala.Function0.

Так что df.withColumns("newCol", functions.expr("concat(col1, my_funct(1))")); работает правильно, но это неправильно и плохо пахнет.

UDFRegistration в org.apache.spark.sql имеет метод register[RT: TypeTag](name: String, func: Function0[RT]): UserDefinedFunction. Java видит этот метод как register(String name, Function0<RT> func, TypeTag<RT> evidence$1). Я могу написать scala.Function0 реализация, но что такое ТипTag доказательство $ 1?

ответ

0

я решить эту проблему с помощью следующей уловке:

UDF1<Object, String> my_func = o -> "some_generated_string"; 
sqlContext.udf().register("my_func", my_func, DataTypes.StringType); 

String expression = "concat(`col1`, my_func())"; 
expression = expression.replace("my_func()", "my_func(null)"); 

df.withColumns("newCol", functions.expr(expression));