0

我正在尝试使用 PIG 构建非结构化数据以进行一些处理。

以下是数据样本:

Nov 1   18:23:34    dev_id=03   user_id=000 int_ip=198.0.13.24  ext_ip=68.67.0.14   src_port=99 dest_port=213   response_code=5

预期输出:

Nov 1 18:23:34, 03 , 000, 198.0.13.24, 68.67.0.14, 99, 213, 5

我们可以看到数据没有正确分隔(如制表符或逗号),所以我尝试使用 '\t' 加载数据并转储到终端上。

A = LOAD '----' using PigStorage('\t') as (mnth: chararray, day: int, --------);

dump A;

Store A into '\root\output';

输出:

转储输出:

(Nov,1,18:23:34,dev_id=03,user_id=000,int_ip=198.0.13.24,ext_ip=68.67.0.14,src_port=99,dest_port=213,response_code=5)

存储输出:结果存储为与输入相同,而不是转储(逗号分隔)。

Nov 1   18:23:34    dev_id=03   user_id=000 int_ip=198.0.13.24  ext_ip=68.67.0.14   src_port=99 dest_port=213   response_code=5

替代方案:我也尝试使用 DataStorage() 作为 (value: varchar) 加载数据并执行 TOKENIZE,但无法实现目标。

我需要的更多建议:

  1. 因为我将 3 个字段存储为月:“11 月”、日:“1”和时间:“18:23:34”。是否可以将所有三个字段作为时间加入:“Nov 1 18:23:34”。

  2. 所有数据都存储有 dev_id=03、user_id=000 等信息,但我需要删除这些信息并存储 03,000,198.0.13.24 等信息。

是否可以使用 PIG 完成所有处理,或者我们需要编写 MapReduce 程序。

编辑:1

收到评论后,我尝试了 REGEX_EXTRACT 单列,效果很好。对于多列,我尝试了 REGEX_EXTRACT_ALL 如下:

A = LOAD '----' using PigStorage('\t') as (mnth: chararray, day: int, dev: chararray, user: chararray --------);

B = foreach A generate REGEX_EXTRACT_All(devid, userid, '(^.*=(.*)$) (^.*=(.*)$)');

Dump B;

我收到错误:

Error: ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1070: Could not resolve REGEX_EXTRACT_All using imports.

我们可以使用 REGEX_EXTRACT_All 提取多个字段吗?

4

2 回答 2

0

因为我将 3 个字段存储为月:“11 月”、日:“1”和时间:“18:23:34”。是否可以将所有三个字段作为时间加入:“Nov 1 18:23:34”。

您可以使用CONCATFOREACH. 在这种情况下(这有点尴尬,也许有人可以提出一个不需要 UDF 的替代方案):

CONCAT(CONCAT(CONCAT(CONCAT(mnth, ' '), day), ' '), 'time')

所有数据都存储有 dev_id=03、user_id=000 等信息,但我需要删除这些信息并存储 03,000,198.0.13.24 等信息。

你应该使用REGEX_EXTRACT这个,它提取一段给定正则表达式的文本。在FOREACH. 构建一个正则表达式来抓取=. 在这种情况下:

REGEX_EXTRACT(field2, '^.*=(.*)$', 1);

其他一些选项:

  • 编写自己的自定义 Java 存储函数以在 java 中进行解析
  • 编写 UDF(python、java 等)来执行上述操作,而不是REGEX_EXTRACT嵌套CONCAT.
  • 将整个行作为一个字符数组加载,然后将其传递到一个 UDF 中,该 UDF 进行所有解析,返回结果。这个 UDF 被放入一个FOREACH. 我比编写自定义存储函数更喜欢这个,因为我认为它更容易一些。
  • *
于 2013-08-28T13:59:42.947 回答
0

只需为您的数据编写一个自定义加载器,您的所有问题都将使用 java 轻松解决。可以在此处找到逐步执行此操作的示例

于 2013-08-28T13:51:11.293 回答