【发布时间】:2020-01-11 00:05:18
【问题描述】:
我在 pyspark 中有一个非常大的数据框。它有超过 1000 万行和 30 多列。
在整个数据帧中搜索给定值列表并删除包含该值的行的最佳和有效方法是什么?
给定的值列表: 列表=['1097192','10727550','1098754'] 数据框(df)是: +---------+-------------+---------------+-------- -+------------+ |编号 |名字 |姓氏 |工资 |验证码 | +---------+-------------+---------------+-------- -+------------+ | 1986 |罗利 |勒温 | 1097192 | 42254172 | - 删除行 | 289743 |卡里尔 |苏德隆 | 2785190 | 3703538 | | 3864 |马西米利亚诺 |达利科特 | 1194553 | 23292573 | | 49074 |格里 |格林诺夫 | 1506584 | 62291161 | | 5087654 |纳特 |皮革借 | 1781870 | 55183252 | | 689 |泰恩 |小酒| 2150105 | 40583249 | | 7907 |美琳 |克罗利 | 2883250 | 70380540 | |第887章纳达 |雷迪尔 | 2676139 | 10727550 | - 删除行 | 96533 |桑尼 |博斯登 | 1050067 | 13110714 | | 1098754 |丹尼 |麦加希 | 1804487 | 927935 | - 删除行 +---------+-------------+---------------+-------- -+------------+如果它是一个较小的数据框,我可以使用 collect() 或 toLocalIterator() 函数,然后遍历行并根据列表值将其删除。
由于它是一个非常大的数据框,解决此问题的最佳方法是什么?
我现在想出了这个解决方案,但有没有更好的方法:
column_names = df.schema.names 对于 column_names 中的名称: df = df.filter(~col(name).isin(list))【问题讨论】:
-
在进行过滤之前是否需要保留数据框中的所有列?这些数据以哪种格式存储?是分区的吗?您在哪里执行代码(在本地机器、集群等中)?
-
我需要保留所有列,因为要搜索的值可以在数据框的任何列中。代码在集群上执行,最终输出格式为csv。
标签: python apache-spark pyspark apache-spark-sql