如何将数组传递给udf spark

时间:2017-07-20 12:52:29

标签: sql scala apache-spark

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

这是我的代码:

delete from myTable
where rowid not in (select min(rowid)
                    from myTable
                    group by name,company,position)

提前致谢!

1 个答案:

答案 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应该都是表示同一数据框中的数组的列,即您应该在相关列的连接后定义它们。