2016-12-19 26 views
0

我想從我的資源庫僅提取3天以內(2015/10/01至2015/10/03)的數據。以下邏輯將首先提取Test文件夾內的所有文件,然後在「選擇」語句中將其分爲3天,因此執行時間太長。 是否有可能只提取文件3天,而不提取所有文件。僅提取U-SQL中的必需文件

DROP VIEW IF EXISTS dbo.Read; 
CREATE VIEW IF NOT EXISTS dbo.Read AS 


EXTRACT  
    ControllerID int?,   
    ParameterID int?, 
    MeasureDate DateTime, 
    Value float, 
    date DateTime 
FROM 
"adl://eclwpsdatalake.azuredatalakestore.net/Test/{date:yyyy}/{date:M}/{date:d}/Testfile.csv" 
USING Extractors.Csv(silent:true,quoting : true, nullEscape : "/N"); 

@res = 
SELECT * FROM dbo.Read 
WHERE date BETWEEN DateTime.Parse("2015/07/01") AND DateTime.Parse("2015/07/03"); 

OUTPUT @res 
TO "adl://eclwpsdatalake.azuredatalakestore.net/WPS/TestMusigma/loop.csv" 
USING Outputters.Csv(); 

回答

0

Partition elimination已確保您的查詢只有符合謂詞的文件纔會被真正讀取(您可以在job graph中確認)。

參見我以前的How to implement Loops in U-SQL

答案如果您有剩餘的約性能的關注,作業圖還可以幫助你明確它們的來源。

+0

謝謝你的回答。它正在工作,但如果我使用「之間」,它會提取所有日期(日期不在於開始日期和結束日期之間的謊言),然後過濾400天。 – Bond

+0

嗨邦德。如果您使用BETWEEN並且作業圖顯示了所有文件(而不是僅適用於謂詞的那些文件),請將鏈接發送至電子郵件作業(Microsoft的usql),以便我們調查? –

0

您可以在文件集規範的部分路徑或部分名稱中使用模式標識符(請參閱https://msdn.microsoft.com/en-us/library/azure/mt771650.aspx)。你可以做文件列表,所以如果你只能在每個目錄中有一個文件,你可以做;

EXTRACT ... 
FROM "adl://eclwpsdatalake.azuredatalakestore.net/Test/2015/07/1/Testfile.csv" 
    , "adl://eclwpsdatalake.azuredatalakestore.net/Test/2015/07/2/Testfile.csv" 
USING ...; 

如果每個目錄中有多個文件,您可以對每一天進行單獨提取,然後合併結果。喜歡的東西:

@a = EXTRACT .... 
    FROM "adl://eclwpsdatalake.azuredatalakestore.net/Test/2015/07/1/{*}.csv" 
    USING ...; 
@b = EXTRACT ....   
    FROM "adl://eclwpsdatalake.azuredatalakestore.net/Test/2015/07/2/{*}.csv" 
    USING ...; 
@fullset = SELECT * FROM @a UNION SELECT * FROM @b; 

不幸的是,我相信是沒有的那一刻文件集讓你做上述情況在一個EXTRACT語句列表。

+0

我有400個文件,我不能寫400個提取語句。但如果使用我的上面的代碼,它將獲取所有文件,然後根據我的開始日期和結束日期來子集400個文件。 – Bond