从 Spark 数据框列中 ArrayType 类型的行中获取不同的元素

Posted

技术标签:

【中文标题】从 Spark 数据框列中 ArrayType 类型的行中获取不同的元素【英文标题】:Get distinct elements from rows of type ArrayType in Spark dataframe column 【发布时间】:2018-09-13 23:12:05 【问题描述】:

我有一个具有以下架构的数据框:

    root
     |-- e: array (nullable = true)
     |    |-- element: string (containsNull = true)

例如,启动一个数据框:

val df = Seq(Seq("73","73"), null, null, null, Seq("51"), null, null, null, Seq("52", "53", "53", "73", "84"), Seq("73", "72", "51", "73")).toDF("e")

df.show()

+--------------------+
|                   e|
+--------------------+
|            [73, 73]|
|                null|
|                null|
|                null|
|                [51]|
|                null|
|                null|
|                null|
|[52, 53, 53, 73, 84]|
|    [73, 72, 51, 73]|
+--------------------+

我希望输出是:

+--------------------+
|                   e|
+--------------------+
|                [73]|
|                null|
|                null|
|                null|
|                [51]|
|                null|
|                null|
|                null|
|    [52, 53, 73, 84]|
|        [73, 72, 51]|
+--------------------+

我正在尝试以下 udf:

def distinct(arr: TraversableOnce[String])=arr.toList.distinct
val distinctUDF=udf(distinct(_:Traversable[String]))

但它仅在行不为空时才有效,即

df.filter($"e".isNotNull).select(distinctUDF($"e")) 

给我

+----------------+
|          UDF(e)|
+----------------+
|            [73]|
|            [51]|
|[52, 53, 73, 84]|
|    [73, 72, 51]|
+----------------+

但是

df.select(distinctUDF($"e")) 

失败。在这种情况下,如何使 udf 句柄为空?或者,如果有更简单的方法来获取唯一值,我想尝试一下。

【问题讨论】:

***.com/questions/37801889/… 【参考方案1】:

只有当列值不是null 时,您才能使用when().otherwise() 应用您的UDF。在这种情况下,.otherwise(null) 也可以跳过,因为它在未指定 otherwise 子句时默认为 null

val distinctUDF = udf( (s: Seq[String]) => s.distinct )

df.select(when($"e".isNotNull, distinctUDF($"e")).as("e"))

【讨论】:

以上是关于从 Spark 数据框列中 ArrayType 类型的行中获取不同的元素的主要内容,如果未能解决你的问题,请参考以下文章

数据框列中的嵌套列表,提取数据框列中列表的值 Pyspark Spark

在两个 Spark 数据框列中查找公共元素的有效方法

展平并从 Spark 中的 Struct 类型数据框列中读取值

Pyspark 通过使用另一列中的值替换 Spark 数据框列中的字符串

如何从 pyspark 数据框列中的列表中删除特定字符串

从字符串 PySpark 数据框列中删除正则表达式