系统日志数据的hadoop配置单元表

7gs2gvoe  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(327)

我正在尝试创建一个配置单元外部表,以便将syslog消息分为四列:timestamp、host、programname+pid和message。我不想求助于regex-serde,因为我也希望impala可以使用这个表(不支持regex-serde)。
问题是,如果我用四个字段定义模式,并指定“\040”作为字段分隔符,那么最后只得到消息的第一个字符串。例如,此日志行:

2014-01-01T04:00:00 myhost sshd[9008]: joe logged in from 192.168.1.1 with password ....

Map为:

timestamp: 2014-01-01T04:00:00
host: myhost
prog: sshd[9008]:
msg: joe

“从…登录”会被砍掉。
假设有四列,有没有办法告诉hive将剩余的字段放在最后一列,而不是将它们遗漏?贪婪的选择?
谢谢

eiee3dmh

eiee3dmh1#

我通过为整个日志行定义一个只有一列的配置单元表来解决这个问题,然后在impala中使用regexp\u extract来创建一个视图。
在配置单元中,将表创建为:

create EXTERNAL TABLE hive_syslog_table (logline STRING) LOCATION '/logs';

然后在 Impala :

create view syslog_view as select regexp_extract(logline,'(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(.+)',1) ts, regexp_extract(logline,'(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(.+)',2) host, regexp_extract(logline,'(\\S+)\\s+(\\S+)\\s+(\\S+)([:\\/\\[\\ ])\\s+(.+)',3) prog, regexp_extract(logline,'(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(.+)',4) msg from hive_syslog_table;

相关问题