在 USQL 中连接来自不同路径的文件

Join files from different pathes in USQL

我的数据每天保存在以下路径中:“/Data/{year}/{month}/{day}/mydata.json” 所以,例如"/Data/2018/10/1/mydata.json" , "/Data/2018/10/2/mydata.json", "/Data/2018/11/1/mydata.json", "/Data/2018/12/5/mydata.json",等等

我想使用 USQL 将所有月份和日期合并到一个文件中。是否可以在不单独提及每条路径的情况下以简单的方式做到这一点(否则一年中的所有日子都这样做是疯狂的)?

目前我使用这个:

    
REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];

USING Microsoft.Analytics.Samples.Formats.Json;


@a  =
   EXTRACT EventCategory string
          , EventAction string
    , EventLabel string
    FROM  "/Data/2018/10/2/mydata.json"
    USING new JsonExtractor()

 UNION ALL 
 
 EXTRACT EventCategory string
          , EventAction string
    , EventLabel string
    FROM  "/Data/2018/11/2/mydata.json"
   USING new JsonExtractor(); 

 OUTPUT @a
   TO "/Output/mydata.Csv"
  USING Outputters.Csv(outputHeader:true);  
    
    

I would like to combine all the months and days in one file using USQL. Is it possible to do it in an easy way without mentioning each path separately (otherwise it's crazy to do it for all the days of the year)?

是的!您可以使用模式来做到这一点,一个基本的例子:

REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];

DECLARE @input string = "/Data/2018/{*}/2/mydata.json";

USING Microsoft.Analytics.Samples.Formats.Json;

@a  =
   EXTRACT EventCategory string
          , EventAction string
          , EventLabel string
    FROM  @input
    USING new JsonExtractor()

 OUTPUT @a
   TO "/Output/mydata.Csv"
  USING Outputters.Csv(outputHeader:true);  

这将加载该月第二天的所有数据。

其他变体:

DECLARE @input string = "/Data/2018/{*}/{*}/mydata.json"; 将处理 2018 年的所有文件

DECLARE @input string = "/Data/{*}/12/{*}/mydata.json"; 将处理所有年份的第 12 个月生成的所有文件

如果您想检索文件部分以获得实际日期部分,您可以执行以下操作:

REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];

USING Microsoft.Analytics.Samples.Formats.Json;

@a  =
   EXTRACT EventCategory string
          , EventAction string
          , EventLabel string
          , date DateTime
    FROM  "/Data/{date:yyyy}/{date:MM}/{date:dd}/mydata.json"
    USING new JsonExtractor()

 OUTPUT @a
   TO "/Output/mydata.Csv"
  USING Outputters.Csv(outputHeader:true);  

如您所见,现在有一个类型为 DateTime 的附加列 date,可用于输出中包含的查询 and/or。