如何在火花中将列转换为数组[长]
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]) => !(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 会出现运行时错误
【讨论】:
以上是关于如何在火花中将列转换为数组[长]的主要内容,如果未能解决你的问题,请参考以下文章