取消
顯示的結果
而不是尋找
你的意思是:

寫作DataFrame變成一個持久表無法忍受緩慢

data_boy_2022
新的貢獻者三世

我想改變一個DF用一個簡單的UDF。後來我想在一個新表存儲生成的DF(參見下麵的代碼)

關鍵=“test_key”模式= StructType ([StructField (“* * *”, StringType(),真的),StructField(“多”,StringType(),真的),StructField(打鼾聲,StringType(),真的),])def custom_udf(數據):……返回(“測試”、“測試”、“測試)customUDF = udf (custom_udf、模式)result_df = big_df.filter(坳(“關鍵”)= =留有遺囑)。withColumn(“結果”,customUDF(坳(“數據”)))result_df = result_df。選擇(“*”,上校(“。*”)).drop (col(“結果”))打印(result_df.count ()) test_df = result_df.collect()打印(test_df.show (5) result_df.write.saveAsTable (“default.test_table”)

我有性能問題,希望更好地理解性能問題來自哪裏以及如何處理它們。

big_df ~ 170緒條目。

result_df ~ 18緒條目。

第17行:打印(result_df.count()) = >跑得快(1秒)

18/19/20行:非常非常緩慢(花了90分鍾! !)

起初我以為UDF減慢轉換。但我想轉換已經執行第17行後,我叫數()。我沒有一種直覺為什麼其餘如此緩慢。

我怎麼能加快寫一個表嗎?我怎樣才能更好的調試問題解決它自己下次?

編輯:

攝取csv數據流自動加載器和存儲數據作為三角洲表在幾秒內發生。所以我不明白為什麼寫DataFrame表是如此緩慢。

1接受解決方案

接受的解決方案

田
新的貢獻者三世

這就跟你問聲好!一般來說,這是好的做法,以避免收集()行動,除非你絕對需要,因為收集()操作操作,將檢索所有元素的抽樣/ DataFrame /數據集從所有節點驅動節點。如果數據集足夠大,你甚至可能會遇到內存不足問題。

在你的管道,你讀數據,執行ETL,然後直接寫出數據到一個對象存儲(在這種情況下,DBFS),你不需要添加這個收集()操作。

在原帖子查看解決方案

2回答2

田
新的貢獻者三世

這就跟你問聲好!一般來說,這是好的做法,以避免收集()行動,除非你絕對需要,因為收集()操作操作,將檢索所有元素的抽樣/ DataFrame /數據集從所有節點驅動節點。如果數據集足夠大,你甚至可能會遇到內存不足問題。

在你的管道,你讀數據,執行ETL,然後直接寫出數據到一個對象存儲(在這種情況下,DBFS),你不需要添加這個收集()操作。

Vidula
尊敬的貢獻者

你好@Jan R

希望一切都好!隻是想檢查如果你能解決你的問題,你會很高興分享解決方案或答案標記為最佳?其他的請讓我們知道如果你需要更多的幫助。

我們很想聽到你的聲音。

謝謝!

歡迎來到磚社區:讓學習、網絡和一起慶祝

加入我們的快速增長的數據專業人員和專家的80 k +社區成員,準備發現,幫助和合作而做出有意義的聯係。

點擊在這裏注冊今天,加入!

參與令人興奮的技術討論,加入一個組與你的同事和滿足我們的成員。

Baidu
map