【问题标题】:Raw log parsing using PIG使用 PIG 解析原始日志
【发布时间】:2014-07-16 10:38:32
【问题描述】:

我正在尝试使用 PIG 解析原始日志。

以下是数据示例:

Thu Jul 13 06:02:36.157 2014 INFO:  pid 018 8: 2:81924:=[]| A=[100]| B=[]| C=[0] | D=[32]| E=[1]| F=[~1~0~1~0]| G= | H=[14]| I=[~0~0~0~1~0~0]| J=[1]| K=[0]| L=[0]

Thu Jul 13 16:42:36.213 2014 INFO:  pid 08 8: 2:81931: Dispatcher:UID=1F4, A=32, B=0, F=2, H=2, J=0, L=414

Thu Jul 03 16:42:36.646 2014 WARNING:  pid 028 8: 2:81939: no data found

预期输出:

(date, A, H, L)

(Thu Jul 13 6:02:36.57 2014, 100, 14, 0)
(Thu Jul 13 16:42:36.13 2014, 32, 2, 414)

示例脚本:

数据未正确分隔(如制表符或逗号),因此我尝试使用 textloader() 加载数据。因为我需要从“信息”中提取信息,所以根据信息和警告过滤日志。

raw_logs = LOAD 'test1.log' USING TextLoader() as (line:chararray);

info = FILTER raw_logs BY (line matches '.*INFO.*');

warning = FILTER raw_logs BY (line matches '.*WARNING.*');

data = FOREACH info GENERATE SUBSTRING(line, 0, 28) AS date, REGEX_EXTRACT(line, 'A=([0-9]*)',1) AS A, REGEX_EXTRACT(line, 'H=([0-9]*)',1) AS H, REGEX_EXTRACT(line, 'L=([0-9]*)',1) AS L;

输出:

(Thu Jul 13 06:02:36.157 2014 ,,,)
(Thu Jul 13 16:42:36.213 2014 ,32,2,414)

我的 REGEX 无法从 [ ] 中提取。另外,我尝试了 FLATTEN 和 TOKENIZE 功能,但无法获得所需的输出。谁能建议我解决问题的正确方法。

还有一件事,是否有任何可能的方法为 REGEX_EXTRACT_ALL 函数编写一个正则表达式,该函数适用于所有 3 种情况并提取所有字段信息,例如 pid、uid 和其他字段等。

【问题讨论】:

  • This question 处理类似的问题,描述了两种不同的方法。

标签: regex apache-pig


【解决方案1】:

我认为你需要逃避[]

data = foreach info generate ..., REGEX_EXTRACT(line, 'A=\\[([0-9]*+)\\]', 1)
                                , REGEX_EXTRACT(line, 'H=\\[([0-9]*+)\\]', 1)
                                , REGEX_EXTRACT(line, 'L=\\[([0-9]*+)\\]', 1)

【讨论】:

  • 感谢 Regex,但它仅适用于一种情况(Thu Jul 13 6:02:36.57 2014, 100, 14, 0)。对于第二种情况,输出是 (Thu Jul 13 16:42:36.213 2014 ,,,)
【解决方案2】:

试试这个,

result = FOREACH info GENERATE SUBSTRING(line, 0, 28) AS date, REGEX_EXTRACT(line, 'A=\\[*([0-9]*)\\]*',1) AS A, REGEX_EXTRACT(line, 'H=\\[*([0-9]*)\\]*',1) AS H, REGEX_EXTRACT(line, 'L=\\[*([0-9]*)\\]*',1) AS L;

希望它能为我工作并为我工作......

【讨论】:

  • 感谢正则表达式。是否有任何可能的方法为 REGEX_EXTRACT_ALL 函数编写正则表达式,该函数适用于所有 3 种情况,并提取所有字段信息,例如 pid、uid 和其他字段等。因此无需编写单独的函数,如 SUBSTRING 等。
  • 你也可以使用上面的代码来改变其他字段。例如 REGEX_EXTRACT(line, 'B=\[([0-9])\]*',1), REGEX_EXTRACT(line, 'C=\[([0-9 ])\]*',1)。尝试在所有领域都这样实现,这很容易。学习 REGEX 并访问regexr.com 并进行练习。
猜你喜欢
  • 2011-02-18
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 2021-01-27
  • 1970-01-01
相关资源
最近更新 更多