我一直在尝试使用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
错误引用文件中某处遇到标题文本的位置。
我的问题是,使用文本提取器,是否有一种方法可以指导它根据行的起始字符或类似内容跳过处理行?或者,我是否需要编写自定义提取器来完成此操作?
答案 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();