2016-12-19 24 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