簡體   English   中英

檢查 pyspark dataframe 是否為空導致 memory 問題

[英]Check if pyspark dataframe is empty causing memory issues

我有一張大約有 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 會有所幫助,因此它不必通過數百行 go ,只需檢查它是否為空。 如果我取出計數部分,它工作正常。

我已經看到了一些重寫計數語句的方法(我已經通過如何檢查 spark dataframe 是否為空? ),但到目前為止我還沒有運氣。

我發現這是確定火花 dataframe 是否確實為空的更有效方法:

df.first() == 無

在使用 .limit(1)、.head()、.count() 等對其進行測試后

Spark 很懶惰 這意味着,當您運行spark.sql()時,實際上什么都沒有發生。 您可以通過注意到spark.sql()立即“執行”來看到這一點,無論 SQL 復雜性如何。 實際處理是在需要操作時完成的; 在您的情況下,當.count()發揮作用時。 由於 SQL 的復雜性和表的大小,后者可能會導致 memory 問題。

也許您可以嘗試的另一件事是閱讀整個表格並讓 Spark 檢查是否有重復項。 但是,鑒於表的原始大小,這也可能導致 memory 問題。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM