如文档中所示,它是列出最多22个所有参数的唯一选项吗?
https://spark.apache.org/docs/1.5.0/api/scala/index.html#org.apache.spark.sql.UDFRegistration
有人想出如何做类似的事情吗?
sc.udf.register("func", (s: String*) => s......
Run Code Online (Sandbox Code Playgroud)
(编写跳过空值的自定义concat函数,当时只有2个参数)
谢谢
这个问题已在此处针对 Scala提出,在我使用 Java API 时它对我没有帮助。我真的把所有东西和厨房水槽都扔了,所以这是我的方法:
List<String> sourceClasses = new ArrayList<String>();
//Add elements
List<String> targetClasses = new ArrayList<String>();
//Add elements
dataset = dataset.withColumn("Transformer", callUDF(
"Transformer",
lit((String[])sourceClasses.toArray())
.cast(DataTypes.createArrayType(DataTypes.StringType)),
lit((String[])targetClasses.toArray())
.cast(DataTypes.createArrayType(DataTypes.StringType))
));
Run Code Online (Sandbox Code Playgroud)
对于我的 UDF 声明:
public class Transformer implements UDF2<Seq<String>, Seq<String>, String> {
// @SuppressWarnings("deprecation")
public String call(Seq<String> sourceClasses, Seq<String> targetClasses)
throws Exception {
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,执行不会通过 UDF 调用,这是意料之中的,因为我无法匹配类型。请在这方面帮助我。
我尝试了@Oli 建议的解决方案。但是,我得到以下异常:
org.apache.spark.SparkException: Failed to execute user defined function($anonfun$261: (array<string>, array<string>) => string)
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.project_doConsume_0$(Unknown Source)
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.processNext(Unknown Source)
at org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43) …Run Code Online (Sandbox Code Playgroud)