hadoop配置单元serde行格式,用于字符串引用的空格分隔文件

9ceoxa92  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(333)

我正在尝试使用以下格式为日志文件创建配置单元表。
日志文件:


# 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模式,但没有任何运气。
关于这里可能出现的问题有什么建议或提示吗?
提前谢谢!

mutmk8jj

mutmk8jj1#

我尝试了下面的正则表达式,我能得到26个字段不知道哪个字段丢失

^(\S+\s\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s*(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(".*")\s(\S+)\s(\S+)\s(\S+)\s(\S)\s(".*")\s(\S*)

相关问题