首页 > 解决方案 > U-SQL Azure Data Lake Analytics 按日期搜索文件

问题描述

我有 U-SQL 脚本,它使用文件模式在 Azure Data Lake 中查找文件并从中提取一些数据:

DECLARE @input_file string = @"\data\{*}\{*}\{*}.avro";
@data = EXTRACT 
        Column1 string,
        Column2 double
FROM @input_file
USING new MyExtractors.AvroExtractor();

文件模式是:

data/{Namespace}-{EventHub}-{PartitionId}/{Year}-{Month}-{Day}/{Hour}-{Minute}-{Second}

问题:自定义提取器执行速度非常慢。我在数据湖中有很多文件,处理需要 15 小时,每次运行成本为 600 美元。太慢而且太贵。

我只需要从不超过 90 天的文件中提取新数据。如何使用文件模式、文件修改日期或任何其他技术过滤掉旧文件?

标签: azureazure-data-factoryazure-data-lakeu-sqlazure-stream-analytics

解决方案


您可以使用 的.AddDays方法DateTime.Now,尽管这是否真的过滤掉所有文件(我认为)取决于您的自定义提取器,例如

//DECLARE @input_file string = @"\data\{*}\{*}\{*}.csv";
DECLARE @input_file string = @"\data\{Namespace}-{EventHub}-{PartitionId}\{xdate:yyyy}-{xdate:MM}-{xdate:dd}\{Hour}-{Minute}-{Second}.csv";


// data/{Namespace}-{EventHub}-{PartitionId}/{Year}-{Month}-{Day}/{Hour}-{Minute}-{Second}
@input =
    EXTRACT Column1 string,
            Column2 double,
            xdate DateTime,
            Namespace string,
            EventHub string,
            PartitionId string,
            Hour int,
            Minute int,
            Second int
    FROM @input_file
    USING Extractors.Csv();
//USING new MyExtractors.AvroExtractor();


@output =
    SELECT Column1,
           Column2
    FROM @input
    WHERE xdate > DateTime.Now.AddDays(-90);


OUTPUT @output
TO "/output/output.csv"
USING Outputters.Csv();

在我使用 .Csv 进行的简单测试中,这可以将输入流从 4 个流减少到 3 个流,但如前所述,我不确定这是否适用于您的自定义提取器。

本地结果


推荐阅读