按前缀跳过行

Skip Line By Prefix

我一直在尝试使用 Azure Data Lake Analytics 对一大组 IIS 日志文件进行一些分析。到目前为止,我可以使用类似这样的方法使它适用于单个 best-case 文件:

@results = 
     EXTRACT
     s_date DateTime,
     s_time string,
     s_ip string,
     cs_method string,
     cs_uristem string,
     cs_uriquery string,
     s_port int,
     cs_username string,
     c_ip string,
     cs_useragent string,
     sc_status int,
     sc_substatus int,
     sc_win32status int,
     s_timetaken int
FROM @"/input/u_ex151115.log"
USING Extractors.Text(delimiter:' ', skipFirstNRows: 4);

@statuscount = SELECT COUNT(*) AS TheCount,
           sc_status
           FROM @results
           GROUP BY sc_status;

OUTPUT @statuscount
  TO  @"/output/statuscount_results.tsv"
USING Outputters.Tsv();

如您所见,在 EXTRACT 语句中,我使用 skipFirstNRows 属性跳过了 IIS 日志文件 header。我遇到的问题 运行 是我输入的许多日志文件在文件中间包含 headers,大概是因为 IIS 应用程序池在白天的某个时间点重新启动了。当我尝试在查询中包含这些文件时,出现以下错误:

Unexpected number of columns in input record at line 14. Expected 14 columns, processed 6 columns out of 6.

错误引用了文件中遇到 header 文本的某个位置。

我的问题是,使用文本提取器,有没有办法根据行的起始字符或类似的东西来指示它跳过对行的处理?或者,我是否需要编写自定义提取器来完成此操作?

基于文本提取器的 documentation,使用 slient 参数将导致任何没有正确列数的行静默失败,从而允许继续处理下一行。由于 IIS 日志 header 与日志数据的列数不同,将此属性设置为 true 解决了我的问题。

所以,我修改后的代码如下所示:

@results = 
     EXTRACT
     s_date DateTime,
     s_time string,
     s_ip string,
     cs_method string,
     cs_uristem string,
     cs_uriquery string,
     s_port int,
     cs_username string,
     c_ip string,
     cs_useragent string,
     sc_status int,
     sc_substatus int,
     sc_win32status int,
     s_timetaken int
FROM @"/input/u_ex140521.log"
USING Extractors.Text(delimiter:' ', silent: true);
@statuscount = SELECT COUNT(*) AS TheCount,
           sc_status
           FROM @results
           GROUP BY sc_status;

OUTPUT @statuscount
  TO  @"/output/statuscount_results.tsv"
  USING Outputters.Tsv();