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

分區修剪/分區消除不適用於文件夾分區JSON文件?(火花3.1.2)

MartinB
貢獻者三世

想象以下設置:

我有日誌文件存儲為JSON文件分區年、月、日和小時身體上的文件夾:

”“”/ logs |——年= 2020 | = 2021年”——年= 2022 |——月= 01 '——月= 02 | = 01 |——天=…”——天= 13小時= 0000 | |,小時=…”——小時= 0900 | log000001。json |——<許多文件>“log000133。json”“”“

火花支持分區發現這樣的文件夾結構(“所有內置文件來源(包括文本/ CSV / JSON /獸人/拚花)能夠發現和推斷分區信息自動”https://spark.apache.org/docs/latest/sql-data-sources-parquet.html partition-discovery)

然而,鑲花的文件相比,我發現火花不使用該元數據信息分區修剪/分區消除當讀取JSON文件

在我用例我隻是感興趣從一個特定的時間窗口(見日誌過濾器:disappointed_face:

(火花.read .format (json) .load (/ logs) .filter(= = 2022年和月02和天= 13小時= 0900))

我認為激發能應用分區列的過濾器“早期”,隻有掃描文件夾匹配過濾器(例如火花不需要掃描文件夾和讀取文件在/日誌/年= 2020)。

然而,在實踐中我的查詢的執行需要大量的時間。看起來我好像火花首先掃描整個文件係統開始的/日誌讀取所有文件,然後應用過濾器(已經)讀取數據。由於嵌套文件夾結構和大量的文件夾/文件這是非常昂貴的。

顯然火花不壓低過濾器(適用於分區修剪/分區消除)。

對我來說,這是奇怪的行為不同於拚花處理JSON文件。

這是像設計的那樣或者一個錯誤嗎?

現在,我最終實現分區修剪自己在預處理步驟中使用dbutils.fs.ls掃描迭代“正確”的文件夾和組裝一個顯式的文件列表,然後我通過火花讀取命令。

1接受解決方案

接受的解決方案

嗨@Martin b,思想門戶讓你影響磚產品路線圖提供直接反饋到產品的團隊。使用門戶的思想:

  • 輸入特性請求。
  • 查看、評論和投票了其他用戶的請求。
  • 監控進展你最喜歡的想法磚產品團隊經過他們的產品規劃和開發過程。

在原帖子查看解決方案

26日回複26

AmanSehgal
尊敬的貢獻者三世

而不是嵌套目錄,你可以嚐試單水平分區和你分區名稱為“year_month_day_hour”(假設你有JSON小時目錄中的文件)。這樣一次火花知道哪個分區看看。

查詢可以是昂貴的如果你的JSON文件非常小(在KBs可能)。

也許檢查文件大小,而不是每小時日誌文件,你會更好,讓他們每天的分區。

最後,也許試著查詢使用坳函數。不確定它會有所幫助,但是值得一試。

從pyspark.sql。功能導入坳火花.read .format (json) .load (' / logs) .filter((坳(年)= 2022)&(坳(月)= 02)& (col(天)= 13)& (col(小時)= 0900)

MartinB
貢獻者三世

嗨@Aman Sehgal,

謝謝你的建議。

不幸的是我沒有影響數據的分區,我隻是一個消費者:persevering_face:

不管怎樣,我想知道為什麼你認為火花能夠應用分區消除是否有而已一個分區的水平。

想象會有3年的數據,這將意味著,將有3 * 365 * 24 = 26280文件夾\下日誌。據我所知,火花仍然會發現所有這些目錄和加載所有發現JSON文件內存之前應用過濾器。

或者你建議確定正確的文件夾手動然後加載正確的文件夾嗎?

這將是分區消除“手冊”,在我看來。

(火花.read .format (json) .load(' /日誌/ 2022 _02_13_0900 '))

我也試著使用上校功能過濾器。不幸的是它沒有在指定過濾器的性能影響肌萎縮性側索硬化症”SQL字符串“條件。:worried_face:

AmanSehgal
尊敬的貢獻者三世

火花不會發現所有目錄。它就會馬上去分區的值。

你能給更多的證明你的假設?像火花日誌或DAG嗎?

我的下一個猜測是,日誌文件中的文件的容量很小。你能檢查和上傳文件大小在最後的分區?

我創建了一個測試設置。

我生成了大量的模擬日誌條目的行;與600000年90天,每天日誌條目(= 54000000行)。每個條目都有一個日誌時間戳。我創建了另一列“裝箱”最近的“5分鍾”窗口中的所有條目。

我保存這個數據幀為JSON, 5 min-timestamp分區的列。

所以我最終有12960文件夾包含每一個JSON文件。

然後我試著:

(火花.read .format (json) .load (f ' {path_base_folder} / some_timestamp_bin_05m = 2022-03-23 18% 3 a00 % 3 a00) .explain(擴展= True))

圖像

以及

(火花.read .format (json) .load (f“{path_base_folder}”) .filter (F.col (some_timestamp_bin_05m) = = 2022-03-23 18:00:00) .explain(擴展= True))

圖像正如您可以看到的,從“輸入大小”指標,第二個語句閱讀所有文件然後應用過濾器。

有趣的是,閱讀前的工作,兩個工作進行;掃描文件係統:

圖像

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

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

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

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

Baidu
map