我有一個很大的blob存儲空間,其中包含許多日誌文件,這些日誌文件按照其級別進行組織:存儲庫,分支,內部版本號,構建步驟號。Azure數據湖中的增量負載
這些是包含對象數組的JSON文件,每個對象都有一個timestamp
和entry
值。我已經實現了一個自定義提取器(擴展爲IExtractor
),它接受輸入流並生成許多純文本行。
初始負載
現在我試圖加載所有的數據到ADL商店。我創建了一個查詢,看起來類似於這樣:
@entries =
EXTRACT
repo string,
branch string,
build int,
step int,
Line int,
Entry string
FROM @"wasb://my.blob.core.windows.net/{repo}/{branch}/{build}/{step}.json"
USING new MyJSONExtractor();
當我運行此提取查詢我得到一個編譯錯誤 - 它超過25分鐘的編譯時間的限制。我的猜測是:太多的文件。所以,我在INSERT INTO
查詢添加一個WHERE
條款:
INSERT INTO Entries
(Repo, Branch, Build, Step, Line, Entry)
SELECT * FROM @entries
WHERE (repo == "myRepo") AND (branch == "master");
仍然沒有運氣 - 編譯器超時。
(它的工作,然而,當我處理一個單一的構建,使{步}作爲唯一的通配符,進行硬編碼名稱的其餘部分。)
問:是否有辦法在許多作業中執行這樣的負載 - 但不需要顯式(手動)「分區」輸入文件列表?
增量負載
假設爲我成功地加載這些文件片刻。但是,從現在起幾天我需要執行更新 - 我該如何指定文件列表?我有一個保留所有元數據的SQL Server數據庫,並且我可以提取確切的日誌文件路徑 - 但U-SQL的EXTRACT
查詢強制我提供一個指定輸入數據的靜態字符串。
一個簡單的方案是爲每個日期定義一個頂級目錄並逐日處理它們。但系統設計的方式使得這非常困難,如果不是不可能的話。
問題:有沒有一種方法來識別文件的創建時間?或者,也許有一種方法可以將查詢與提取查詢結合到SQL Server數據庫中?
這正是我們現在計劃要做的事情:擁有一個C#服務,用於查詢我們的SQL Server並生成包含硬編碼文件路徑的U-SQL腳本。它沒有一個腳本來完成這項工作的優雅,但肯定是可行的。 – lbartnik