0

我有一张大约有 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 会有所帮助,因此它不必经过数百行,只需检查它是否为空。如果我取出计数部分,它工作正常。

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

4

2 回答 2

0

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

df.first() == 无

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

于 2021-08-20T16:13:23.813 回答
0

Spark 很懒惰。这意味着,当您运行时,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)
于 2020-06-11T18:11:41.487 回答