Python PySpark在超大数据帧内搜索

Python PySpark在超大数据帧内搜索,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,我在pyspark中有一个非常大的数据帧。它有1000多万行和30多列 在整个数据帧中搜索给定值列表并删除包含该值的行的最佳有效方法是什么 The given list of values: list=['1097192','10727550','1098754'] The dataframe(df) is : +---------+--------------+---------------+---------+------------+ | id | first_nam

我在pyspark中有一个非常大的数据帧。它有1000多万行和30多列

在整个数据帧中搜索给定值列表并删除包含该值的行的最佳有效方法是什么

The given list of values: list=['1097192','10727550','1098754'] The dataframe(df) is : +---------+--------------+---------------+---------+------------+ | id | first_name | last_name | Salary | Verifycode | +---------+--------------+---------------+---------+------------+ | 1986 | Rollie | Lewin | 1097192 | 42254172 | -Remove Row | 289743 | Karil | Sudron | 2785190 | 3703538 | | 3864 | Massimiliano | Dallicott | 1194553 | 23292573 | | 49074 | Gerry | Grinnov | 1506584 | 62291161 | | 5087654 | Nat | Leatherborrow | 1781870 | 55183252 | | 689 | Thaine | Tipple | 2150105 | 40583249 | | 7907 | Myrlene | Croley | 2883250 | 70380540 | | 887 | Nada | Redier | 2676139 | 10727550 | -Remove Row | 96533 | Sonny | Bosden | 1050067 | 13110714 | | 1098754 | Dennie | McGahy | 1804487 | 927935 | -Remove Row +---------+--------------+---------------+---------+------------+ 给定的值列表: 列表=['1097192'、'10727550'、'1098754'] 数据帧(df)是: +---------+--------------+---------------+---------+------------+ |id |名字|姓氏|薪水|验证码| +---------+--------------+---------------+---------+------------+ |1986年| Rollie | Lewin | 1097192 | 42254172 |-移除世界其他地区 |289743 | Karil | Sudron | 2785190 | 3703538| |3864 | Massimiliano | Dallicott | 1194553 | 23292573| |49074 | Gerry | Grinnov | 1506584 | 62291161| |5087654 | Nat | Leatherborrow | 1781870 | 55183252| |689|Thaine|Tipple|2150105|40583249| |7907 | Myrlene | Croley | 2883250 | 70380540| |887 | Nada | Redier | 2676139 | 10727550 |-删除世界其他地区 |96533 |桑尼|博斯登| 1050067 | 13110714| |1098754 | Dennie | McGahy | 1804487 | 927935 |-移除世界其他地区 +---------+--------------+---------------+---------+------------+ 如果它是一个较小的数据帧,我可以使用collect()或toLocalitator()函数,然后迭代行并根据列表值删除它

由于它是一个非常大的数据帧,解决这个问题的最佳方法是什么

我现在已经提出了这个解决方案,但有没有更好的方法:

column_names = df.schema.names for name in column_names: df = df.filter(~col(name).isin(list)) 列名称=df.schema.names 对于“名称”列中的名称: df=df.filter(~col(name).isin(list))
使用
filter
isin
函数可以正确地过滤数据帧。如果列表很小(几千而不是几百万),可以使用
isin
函数。还要确保您的数据帧已分区到执行器上至少3*个CPU。必须有很多分区,否则并行性将受到影响

我对Scala很熟悉,所以请从下面的代码中学习这个概念。您需要通过组合要筛选的所有列来构建一个
对象。然后在
dataframe.filter

column_names = df.schema.names
colFinal // initialize with 1 column name as col("colName").isin(list)
for name in column_names:
    colFinal = colFinal.or(col(name).isin(list))

df = df.filter(!colFinal) // apply negation of final column object

在进行筛选之前,是否需要保留数据帧上的所有列?此数据以何种格式存储?是分区的吗?您在哪里执行代码(在本地计算机、集群等中)?我需要保留所有列,因为要搜索的值可以位于dataframe的任何列中。代码在集群上执行,最终输出格式为csv。