如何在Spark

时间:2017-09-18 14:14:52

标签: apache-spark apache-spark-sql spark-dataframe

我有一个看起来像这样的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不是数据帧的列。

1 个答案:

答案 0 :(得分:1)

您可以使用lit功能:

myDataFrame.filter(fooUdf($"ids", lit(knownIDs))).count()

其中lit是来自org.apache.spark.sql.functions的函数。

顺便说一句。您的UDF函数参数将是WrappedArray类型。最好将Array更改为Seq,因为您将使用Array

获得运行时错误