【问题标题】:U-SQL - Process Last "n" days filesU-SQL - 处理最后“n”天的文件
【发布时间】:2017-11-07 07:12:44
【问题描述】:

环境

  • Azure 数据工厂/U-SQL

场景

  • 我有每天运行的 ADF 管道。并按以下格式创建文件夹和文件。基本上创建了日期明智的文件夹和文件。

  • "/Samples/Data/TestDB/{filedate:yyyy}.{filedate:MM}.{filedate:dd}/TestDetail.{filedate:yyyy}.{filedate:MM}.{文件日期:dd}.csv";

  • 在 U-SQL 中,我想处理最近 7 天的文件。我通过使用虚拟列来选择最近 7 天的文件来创建 U-SQL 脚本。

  • 我在本地运行这些更改。

代码

 @userLoginData =
        EXTRACT filedate DateTime,
                UserLoginAuditDetailId Guid,
                UserId string              
        FROM    @userLoginDetailPath   
        USING   Extractors.Csv();

  @extractedLoginData = 
        SELECT 
                UserLoginAuditDetailId,
                UserId             
        FROM    @userLoginData
        WHERE   filedate.Date.ToString("d") == @sliceEndTime.AddDays(-7).Date.ToString("d"); 

问题

我能够成功运行脚本,但是当 Job compile then job graph 显示时,它正在寻找超过 7 天的文件。请在下面找到图片。基本上它不应该在寻找文件 2017.04.20。对吧?

Job Graph

【问题讨论】:

  • 我想知道您的 WHERE 子句中的函数调用是否复杂到将谓词推回提取器......有点像一个不再可搜索的字段。尝试将虚拟字段的数据类型更改为字符串并进行简单比较?
  • 它仍在挑选所有文件

标签: azure-data-factory u-sql


【解决方案1】:

您可以通过使用 BETWEEN 子句并将您的 fileDate 虚拟列与指定日期进行比较来实现解决方案,例如,

DECLARE @ProcessStart DateTime = new DateTime(@sliceEndTime.Year, @sliceEndTime.Month,@sliceEndTime.Day).AddDays(-n); // n is the no of days 
DECLARE @ProcessEnd DateTime = new DateTime(@sliceEndTime.Year, @sliceEndTime.Month,@sliceEndTime.Day); // current day when slice runs

然后您可以使用过滤文件日期

SELECT * FROM input WHERE    filedate  BETWEEN  @ProcessStart  AND  @ProcessEnd;

这只会处理@ProcessStart@ProcessEnd范围内指定的文件。

如果它解决了您的问题,请告诉我。

【讨论】:

    猜你喜欢
    • 2010-09-08
    • 2012-09-02
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    相关资源
    最近更新 更多