通过前缀跳过线

时间:2016-12-14 13:55:59

标签: azure-data-lake u-sql

我一直在尝试使用Azure Data Lake Analytics对一大组IIS日志文件进行一些分析。到目前为止,我可以使用类似这样的单个最佳案例文件来使用它:

$ cat tst.awk
{ split(prev,p) }
$2 == p[2] {
    print p[1] - $1, p[2]
    prev = ""
    next
}
p[2] != "" {
    print (p[3] == 1 ? p[1] : 0-p[1]), p[2]
}
{ prev = $0 }
END {
    split(prev,p)
    print (p[3] == 1 ? p[1] : 0-p[1]), p[2]
}

$ sort -m -k2 <(sed 's/$/ 1/' file1) <(sed 's/$/ 2/' file2) | awk -f tst.awk
-2 1009
-3 1010
7 1012
1 1013
8 1014

如您所见,在@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属性跳过IIS日志文件标头。我遇到的问题是我输入的许多日志文件都包含文件中间的标题,可能是因为IIS应用程序池在白天的某个时刻重新启动。当我尝试在查询中包含这些文件时,出现以下错误:

skipFirstNRows

错误引用文件中某处遇到标题文本的位置。

我的问题是,使用文本提取器,是否有一种方法可以指导它根据行的起始字符或类似内容跳过处理行?或者,我是否需要编写自定义提取器来完成此操作?

1 个答案:

答案 0 :(得分:1)

基于文本提取器的documentation,使用slient参数将导致任何列数不正确的行无声地失败,从而允许处理继续到下一行。由于IIS日志标题的列数与日志数据的列数不同,因此将此属性设置为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();