我正在尝试使用以下格式为日志文件创建配置单元表。
日志文件:
# Software: 1
# Version: 1
# Start-Date: xx
# Date: xx
# Fields: date time time-taken c-ip cs-username cs-auth-group x-exception-id sc-filter-result cs-categories cs(Referer) sc-status s-action cs-method rs(Content-Type) cs-uri-scheme cs-host cs-uri-port cs-uri-path cs-uri-query cs-uri-extension cs(User-Agent) s-ip sc-bytes cs-bytes x-virus-id x-bluecoat-application-name x-bluecoat-application-operation
# Remark: 3215330049 "SHPROD24A" "10.0.16.162" "main"
2016-08-12 00:35:31 2 172.28.212.88 - - authentication_failed DENIED "unavailable" - 407 TCP_DENIED CONNECT - tcp psoc.ebayc3.com 443 / - - "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0" 10.0.10.198 529 296 - "unavailable" "unavailable"
注:
每个日志文件的前6行是注解行(以“#”开头)
每行中有27个字段不是注解。有些字段是空格分隔的字符串。其他字段是以空格分隔的带引号的字符串,字段中有空格。例如:“string”
简单的以空格分隔的文件会中断,因为有一个带引号的字符串字段。因此,我尝试在行格式中使用serde regex模式。
hiveql创建表查询:
CREATE TABLE test (date_field STRING,
time_field STRING,
time_taken STRING,
c_ip STRING,
cs_username STRING,
cs_auth_group STRING,
x_exception_id STRING,
sc_filter_result STRING,
cs_categories STRING,
csReferer STRING,
sc_status STRING,
s_action STRING,
cs_method STRING,
rsContent_Type STRING,
cs_uri_scheme STRING,
cs_host STRING,
cs_uri_port STRING,
cs_uri_path STRING,
cs_uri_query STRING,
cs_uri_extension STRING,
csUser_Agent STRING,
s_ip STRING,
sc_bytes STRING,
cs_bytes STRING,
x_virus_id STRING,
x_bluecoat_application_name STRING,
x_bluecoat_application_operation STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "(\"[^\"]*\"|'[^']*'|[\S]+)+"
)
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
TBLPROPERTIES ("skip.header.line.count"="6");
结果:运行 SELECT * FROM test LIMIT 10;
给我这个错误:失败与异常
java.io.io文件exception:org.apache.hadoop.hive.serde2.serdeexception:匹配组的数目与列的数目不匹配
我很困惑,因为我的表中有27个字段(用descripe验证),而regex上有27个匹配项。我有一个表属性可以忽略前6行,所以这里的注解应该不是问题。错误消息在这种逻辑中没有太多意义。
我已经测试过正则表达式了https://regex101.com/ 有积极的结果。火柴按我的要求分解田地:
我尝试过为各种其他配置切换regex模式,但没有任何运气。
关于这里可能出现的问题有什么建议或提示吗?
提前谢谢!
1条答案
按热度按时间mutmk8jj1#
我尝试了下面的正则表达式,我能得到26个字段不知道哪个字段丢失