【问题标题】:How to cast Column to Array[Long] in spark如何在火花中将列转换为数组[长]
【发布时间】:2017-09-18 14:14:52
【问题描述】:

我有一个如下所示的 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 不是数据框列。

【问题讨论】:

  • 你可能想看看array_contains
  • 当我必须寻找两个数组之间的交集时没有帮助。
  • 你写的是一个Scala方法。尝试编写像 val arr_intersect = udf ( (seq1: Array[Long] , seq2: Array[Long]) =&gt; !(seq1.intersect(seq2).isEmpty) ) 这样的 UDF
  • 其实我把这个foo方法注册为udf并试了一下。我之前没有在我的问题中提供这些细节,现在我更新了我的问题。

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


【解决方案1】:

你可以使用lit函数:

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

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

顺便说一句。您的 UDF 函数参数将是 WrappedArray 类型。最好把 Array 改成 Seq,因为 Array 会出现运行时错误

【讨论】:

    猜你喜欢
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 2021-07-02
    • 2020-01-03
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多