使用pig将非结构化数据转换为结构化数据

ecbunoof  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(710)

我正在尝试使用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

正如我们所看到的,数据没有正确地分开(比如tab或逗号),所以我尝试使用'\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)

store oputut:结果与输入一样存储,而不是转储(逗号分隔)。

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()as(value:varchar)加载数据,并执行了tokenize,但未能实现目标。
我还需要一些建议:
因为我存储了3个字段,分别是月:“十一月”,日:“1”,时间:“18:23:34”。有没有可能加入所有三个领域的时间:“11月1日18:23:34”。
所有存储有dev\u id=03、user\u id=000等信息的数据,但我需要删除这些信息并存储03000198.0.13.24等信息。
有没有可能用pig做所有的处理,或者我们需要编写mapreduce程序。

edit:1

收到评论后,我尝试了regex\u extract for single column,效果很好。对于多列,我尝试了regex\u extract\u 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提取多个字段吗。

nbnkbykc

nbnkbykc1#

只需为您的数据编写一个自定义加载程序,所有问题都可以用java轻松解决。在这里可以找到一步一步的例子

ftf50wuq

ftf50wuq2#

因为我存储了3个字段,分别是月:“十一月”,日:“1”,时间:“18:23:34”。有没有可能加入所有三个领域的时间:“11月1日18:23:34”。
你可以用 CONCAT 把两个字符连在一起 FOREACH . 在这种情况下(这有点尴尬,也许有人可以建议一个不需要自定义项的替代方案):

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

所有存储有dev\u id=03、user\u id=000等信息的数据,但我需要删除这些信息并存储03000198.0.13.24等信息。
你应该使用 REGEX_EXTRACT 对于这个,它提取一段给定正则表达式的文本。把它用在 FOREACH . 构建一个正则表达式,在 = . 在这种情况下:

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

其他一些选择:
编写自己的自定义java存储函数来用java进行解析
编写udf(python、java等等)来执行上述操作,而不是 REGEX_EXTRACT 和嵌套 CONCAT .
将整行作为一个字符加载,然后将其传递到执行所有解析的udf中,并返回结果。这个自定义项被放入 FOREACH . 我喜欢这比写一个自定义的存储函数,因为我认为它更容易一点。

相关问题