从 PySpark DataFrame 中的列表列表中删除列表

Posted

技术标签:

【中文标题】从 PySpark DataFrame 中的列表列表中删除列表【英文标题】:Remove a list from a list of lists in PySpark DataFrame 【发布时间】:2020-12-23 18:16:31 【问题描述】:

我有以下带有列表列的数据框,其中包含列表列表。 在某些特定情况下,此列表包含一个唯一列表,其中仅包含空字符串。

+--+---------------+
|id|list           |
+--+---------------+
|1 |[[1, a],[2, b]]|
|2 |[[,]]          |

我想过滤掉这个列表,这样我就有了以下内容:

+--+---------------+--------------+
|id|list           |result        |
+--+---------------+--------------+
|1 |[[1, a],[2, b]]|[[1, a],[2, b]|
|2 |[[,]]          |[]            |

我尝试了以下方法:

data_frame.withColumn("result", array_remove("list", ["",""]))

但我有以下错误:

An error occurred while calling z:org.apache.spark.sql.functions.array_remove. Unsupported literal type class java.util.ArrayList [, ]

有什么建议或想法吗?

【问题讨论】:

【参考方案1】:

这里有点棘手 - 我认为使用原始 Spark SQL 查询是合适的:

df2 = data_frame.withColumn('result', F.expr("array_remove(list, array('',''))"))

df2.show()
+---+----------------+----------------+
| id|            list|          result|
+---+----------------+----------------+
|  1|[[1, a], [2, b]]|[[1, a], [2, b]]|
|  2|          [[, ]]|              []|
+---+----------------+----------------+

【讨论】:

我刚试了下,好像差不多!我试图简化,但似乎我的列表不是由数组组成,而是由结构组成,而且我的类型不匹配:AnalysisException: "cannot resolve 'array_remove("list", array('', ''))' due to data type mismatch: Input to function array_remove should have been array followed by a value with same element type, but it's [array<struct<id:int,body:string>>, array<string>] 是否可以用这个结构的硬编码实例替换array('','')

以上是关于从 PySpark DataFrame 中的列表列表中删除列表的主要内容,如果未能解决你的问题,请参考以下文章

PySpark:当列是列表时,将列添加到 DataFrame

为每组 pyspark RDD/dataframe 选择随机列

从 pyspark 中的数据框数组类型列中获取“名称”元素

在 PySpark 的两个不同 pyspark.sql.dataframes 中的两列中创建一个 pyspark.sql.dataframe

PySpark 从 TimeStampType 列向 DataFrame 添加一列

Pyspark - 从 DataFrame 列的操作创建新列给出错误“列不可迭代”