从 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.sql.dataframes 中的两列中创建一个 pyspark.sql.dataframe