【问题标题】:Hive - Regex for the SYSLOG/ERRORLOGHive - SYSLOG/ERRORLOG 的正则表达式
【发布时间】:2020-01-22 20:46:27
【问题描述】:

我想使用 Athena 查询系统日志(基本上是我的 SQL 错误日志)。这是我的示例数据。

2019-09-21T12:19:32.107Z 2019-09-21 12:19:24.17 Server      Buffer pool extension is already disabled. No action is necessary. 

2019-09-21T12:19:32.107Z 2019-09-21 12:19:24.29 Server      InitializeExternalUserGroupSid failed. Implied authentication will be disabled.

所以我创建了一个这样的表:

CREATE EXTERNAL TABLE IF NOT EXISTS bhuvi (
  timestamp string,
  date string,
  time string,
  user string,
  message stringg
 ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
 WITH SERDEPROPERTIES (
 "input.regex" = "(\\w+)\\s+(.*\\-.*\\-.*)\\s+(\\d+:\\d+:\\d+.\\d+)\\s+(\\w+)\\s+(\\w+)"
 ) LOCATION 's3://log/sql_error_log_stream/';

但它没有给出任何结果。有人可以帮我弄清楚吗?

【问题讨论】:

  • 检查字段分隔符并尝试在FIELDS TERMINATED BY中指定它
  • 我不确定作为 Regex serde 选项终止的字段。
  • stringg 也有错别字

标签: regex hive create-table amazon-athena regexserde


【解决方案1】:

几个观察:

  1. 时间戳'2019-09-21T12:19:32.107Z' 不是hive TIMESTAMP 格式,在DDL 中将其定义为STRING 并在此答案中进行转换:https://stackoverflow.com/a/23520257/2700344
  2. serde 中的消息表示为 (\w+) 组。这是错误的,因为消息包含空格。尝试 (.*?)$ 而不是 (\\w+) 作为消息字段。

    试试这个正则表达式:

    (\\S+)\\s+(.*-.*-.*)\\s+(\\d+:\\d+:\\d+\\.\\d+)\\s+(\\S+)\\s+(.*?)$

使用(\\S+) - 这意味着除了空格之外的所有内容。 (\\w+) 不适用于第一组,因为 \\w 仅匹配任何字母数字字符和下划线,并且第一组(时间戳)还包含 -: 字符。

如果在字符类之外[在方括号中]不需要屏蔽,则还使用连字符-。和点。有特殊含义,字面用作点时需要屏蔽:https://stackoverflow.com/a/57890202/2700344

【讨论】:

  • 我试过了。 "input.regex" = "(\\w+)\\s+(.*\\-.*\\-.*)\\s+(\\d+:\\d+:\\d+.\\d+)\\s+(\\w+)\\s+(.*?)$" 但没有结果。 :(
  • @Bhuvanesh 请检查我的正则表达式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2019-06-28
  • 1970-01-01
  • 2015-08-31
  • 2015-01-24
相关资源
最近更新 更多