У меня определен UDF в Scala со значением аргумента по умолчанию, например:
package myUDFs
import org.apache.spark.sql.api.java.UDF3
class my_udf extends UDF3[Int, Int, Int, Int] {
override def call(a: Int, b: Int, c: Int = 6): Int = {
c*(a + b)
}
}
Затем я собираю его соответствующим образом с помощью build clean assembly
(при необходимости могу предоставить больше подробностей сборки) и извлекаю jar myUDFs-assembly-0.1.1.jar
и включите это в мою конфигурацию Spark в Python:
from pyspark.conf import SparkConf
from pyspark.sql import SparkSession
from pyspark.sql.types import IntType
spark_conf = SparkConf().setAll([
('spark.jars', 'myUDFs-assembly-0.1.1.jar')
])
spark = SparkSession.builder \
.appName('my_app') \
.config(conf = spark_conf) \
.enableHiveSupport() \
.getOrCreate()
spark.udf.registerJavaFunction(
"my_udf", "myUDFs.my_udf", IntType()
)
Но, когда я пытаюсь использовать значение по умолчанию, я получаю отказ:
spark.sql('select my_udf(1, 2)').collect()
AnalysisException:'Неверное количество аргументов для функции my_udf.Ожидаемое: 3;Найдено: 2;line x pos y '
Разве невозможно иметь UDF со значением по умолчанию, подобным этому?Выход должен быть 6*(1+2) = 18
.