【问题标题】:Check if pyspark dataframe is empty causing memory issues检查 pyspark 数据框是否为空导致内存问题
【发布时间】:2020-10-01 11:02:21
【问题描述】:

我有一个包含大约 10 亿条记录的表。我对其进行查询以基本上找到重复项。如果查询结果为0行,则没有重复,否则有。如果有重复,我想将该表名写入文本文件。 所以我正在做的是

df = spark.sql("SELECT count(*) FROM table GROUP BY key1,key2,key3 HAVING count(*) > 1 LIMIT 1)
if df.count() > 0:
    with open('duplicate_tables.txt','a') as file:
        file.write('\n' + table)

df.count() 行,我收到类似java.io.IOException: No space left on device 的错误。这是因为count() 效率低下吗?当我尝试使用

时,我也会遇到同样的错误
if len(df.head(1)) != 0:

在我的查询中,我认为(希望)添加 LIMIT 1 会有所帮助,因此它不必经过数百行,只需检查它是否为空。如果我取出计数部分,它工作正常。

我已经看到了一些重写计数语句的方法(我已经通过How to check if spark dataframe is empty?),但到目前为止我还没有运气。

【问题讨论】:

    标签: python sql pyspark write


    【解决方案1】:

    Spark 是 lazy。这意味着,当您运行 spark.sql() 时,实际上什么都没有发生。您可以通过注意到 spark.sql() 立即“执行”来看到这一点,无论 SQL 复杂性如何。实际处理是在需要操作时完成的;在您的情况下,当.count() 发挥作用时。由于 SQL 的复杂性和表的大小,后者可能会导致内存问题。

    也许您可以尝试的另一件事是读取整个表并让 Spark 检查是否有重复项。但是,鉴于表的原始大小,这也可能导致内存问题。

    df = spark.sql("SELECT * FROM table") # or select particular column(s)
    if df.count() != df.dropDuplicates().count():
        with open('duplicate_tables.txt','a') as file:
            file.write('\n' + table)
    

    【讨论】:

    • 所以我只是在 impala-shell 中自行运行查询并检查统计信息:总峰值内存似乎约为 4 GB。我在哪里运行它显示有 13 GB 可用。
    【解决方案2】:

    我发现这是确定 spark 数据框是否确实为空的更有效方法:

    df.first() == 无

    使用 .limit(1)、.head()、.count() 等对其进行测试后

    【讨论】:

      猜你喜欢
      • 2020-09-24
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 2016-08-01
      • 1970-01-01
      • 2015-11-05
      • 2015-12-18
      相关资源
      最近更新 更多