【问题标题】:PySpark search inside very large dataframe在非常大的数据框中进行 PySpark 搜索
【发布时间】: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


【解决方案1】:

您获得了使用filterisin 函数过滤数据框的正确方法。如果列表很小(几千而不是几百万),您可以使用 isin 函数。还要确保您的数据帧在执行程序上至少分区为 3* 数量的 CPU。必须有很多分区,而不会影响并行性。

我对 Scala 很熟悉,所以请从下面的代码中获取这个概念。您需要通过组合所有要过滤的列来构建一个Column 对象。然后在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

【讨论】:

    猜你喜欢
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 2015-03-24
    • 2012-09-22
    • 1970-01-01
    • 2011-03-26
    相关资源
    最近更新 更多