我有一个看起来像这样的udf:
def foo : (ids: Array[Long], knownIds: Array[Long]) : Boolean = {
for (knownId <- knownIds) {
if(ids.contains(knownId)) {
return true;
}
}
return false;
}
而且,我的数据框看起来像这样:
|-- abc: binary (nullable = true)
|-- def: string (nullable = true)
|-- ids: array (nullable = true)
| |-- element: long (containsNull = true)
我按照以下方式调用此udf:
def foo1 (ids: Array[Long]) => Boolean = foo(ids, knownIds)
val fooUdf = udf(foo1)
myDataFrame.filter(fooUdf($"ids")).count()
如何将ColumnName强制转换为Array [Long]以使用此udf?我的scala代码中已经分别有knownIds数组,因此knownIds不是数据帧的列。
答案 0 :(得分:1)
您可以使用lit
功能:
myDataFrame.filter(fooUdf($"ids", lit(knownIDs))).count()
其中lit
是来自org.apache.spark.sql.functions
的函数。
顺便说一句。您的UDF函数参数将是WrappedArray类型。最好将Array更改为Seq,因为您将使用Array
获得运行时错误