如何在火花中将列转换为数组[长]

Posted

技术标签:

【中文标题】如何在火花中将列转换为数组[长]【英文标题】: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 Array Intersection in Spark SQL的可能重复 其实我把这个foo方法注册为udf并试了一下。我之前没有在我的问题中提供这些细节,现在我更新了我的问题。 【参考方案1】:

你可以使用lit函数:

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

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

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

【讨论】:

以上是关于如何在火花中将列转换为数组[长]的主要内容,如果未能解决你的问题,请参考以下文章

如何在火花中将数据帧转换为csv [重复]

如何在火花中将rdd对象转换为数据框

如何在火花数据框中将列连接到一个

如何在presto中将列转换为数组

从Greenplum读取数据时,如何在火花中将十进制值转换为字符串?

如何在 PySpark 中将 Vector 类型的列转换为数组/字符串类型?