[英]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.