我有一个问题1)我真的不知道如何调用已注册的UDF。我找到了一些答案,说使用callUDF,所以这就是我在代码中调用函数的方法。 2)我真的不知道如何将数组作为参数传递。
这是我的代码:
delete from myTable
where rowid not in (select min(rowid)
from myTable
group by name,company,position)
提前致谢!
答案 0 :(得分:2)
您正在尝试使用来自两个不同数据帧的列,这些列在UDF中是非法的。 Spark的UDF只能在每行的基础上工作。您无法合并来自不同数据框的行。为此,您需要在两者之间执行连接。
在您的情况下,您只有一行,但在实际情况下,您将拥有多行,您需要确保您有一些唯一的密钥来加入,例如唯一ID。
如果您没有,并且两个数据帧具有相同的行数和相同数量的分区,则可以轻松地为这两个数据帧创建ID:
df.withColumn("id",monotonicallyIncreasingId)
您可能还应该将列重命名为具有不同的名称。
查看加入的不同选项(请参阅http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.Dataset),了解最符合您需求的选项。
至于注册和调用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))
请注意,temp和temp2应该都是表示同一数据框中的数组的列,即您应该在相关列的连接后定义它们。