Sql 如何将数组传入udf spark

Sql 如何将数组传入udf spark,sql,scala,apache-spark,Sql,Scala,Apache Spark,我有一个问题:1)我真的不知道如何调用已注册的UDF。我发现一些答案是使用callUDF,所以这就是我在代码中调用函数的方式。2) 我真的不知道如何将数组作为参数传入 这是我的密码: val df = Seq(("1","2","3","4","5","6")).toDF("A","B","C","D","E","F") val newdf = Seq(("1","2","3","4","5","6")).toDF("A","B","C","D","E","F") val cols = df.

我有一个问题:1)我真的不知道如何调用已注册的UDF。我发现一些答案是使用callUDF,所以这就是我在代码中调用函数的方式。2) 我真的不知道如何将数组作为参数传入

这是我的密码:

val df = Seq(("1","2","3","4","5","6")).toDF("A","B","C","D","E","F")
val newdf = Seq(("1","2","3","4","5","6")).toDF("A","B","C","D","E","F") 
val cols = df.columns


val temp = Array(df.select($"A"),df.select($"B"),df.select($"C"),df.select($"D"),df.select($"E"),df.select($"F"))
val temp2 = Array(newdf.select($"A"),newdf.select($"B"),newdf.select($"C"),newdf.select($"D"),newdf.select($"E"),newdf.select($"F"))


sparkSession.udf.register ( "myfunc" , ((A:Array[String],B:Array[String]) => {for(i <- 0 to 5)yield( if (A(i)==B(i)) "U" else "N")} ) )


val a = df.withColumn("A",callUDF("myfunc",(temp,temp2)))
val df=Seq((“1”、“2”、“3”、“4”、“5”、“6”)。toDF(“A”、“B”、“C”、“D”、“E”、“F”)
val newdf=序列((“1”、“2”、“3”、“4”、“5”、“6”)。toDF(“A”、“B”、“C”、“D”、“E”、“F”)
val cols=df.columns
val temp=Array(df.select($“A”)、df.select($“B”)、df.select($“C”)、df.select($“D”)、df.select($“E”)、df.select($“F”))
val temp2=数组(newdf.select($“A”)、newdf.select($“B”)、newdf.select($“C”)、newdf.select($“D”)、newdf.select($“E”)、newdf.select($“F”))

sparkSession.udf.register(“myfunc”,((A:Array[String],B:Array[String])=>{for(i您试图使用来自两个不同数据帧的列,这在udf中是非法的。Spark的udf只能按行工作。您不能合并来自不同数据帧的行。为此,您需要在这两个数据帧之间执行联接

在您的情况下,您只有一行,但在实际情况下,您将有多行,您需要确保您有一些唯一的键来连接,例如一个唯一的id

如果没有,并且两个数据帧具有相同的行数和相同的分区数,则可以轻松地为两个数据帧创建一个id,如下所示:

df.withColumn("id",monotonicallyIncreasingId) 
您可能还应该重命名这些列,使其具有不同的名称

查看join的不同选项(请参阅),以查看最符合您需要的选项

关于注册和调用udf,您可以执行以下操作:

def myFunc(s1: Seq[Int], s2: Seq[Int]) = {
  for(i <- 0 to 5) yield {
    if (s1(i)==s2(i)) "U" else "N"
  }
}
val u = udf(myFunc)
val a = df.withColumn("A", myFunc(temp,temp2))
def myFunc(s1:Seq[Int],s2:Seq[Int])={

对于(你能解释一下你想做什么吗?@Shankar Koirala试图将temp和temp 1传递给myfunc来比较两个数组中的元素temp和temp 1数组中包含的数据帧就是你想要比较的吗?你能分享一下你想做的吗do@Shankar柯伊拉腊所以基本上我需要比较一下re来自两个不同数据帧中的6-12列。所以我想把我需要比较的列放在数组中,并将它们传递到一个函数中,然后做一个for循环来比较数组中的列。我有一个问题,因为其他人传递了类似于udf的内容(s.col1,s.col2,s.col3,t.col1.t.col2,t.col3),t和s是两个不同的数据帧,通过这种方式可以调用函数…?如果s和t属于不同的数据帧,则不能在UDF上调用它。可能发生的情况是,s和t包含来自同一数据帧的不同列(即,它们不是数据帧,而是由来自同一数据帧的相关列预先填充的某种结构)。