展平字符串后 Pig 中的模式

Posted

技术标签:

【中文标题】展平字符串后 Pig 中的模式【英文标题】:Schema in Pig after Flattening the String 【发布时间】:2015-02-10 17:25:35 【问题描述】:

在将 pig 中的字符串展平后,我在实现字段对象(模式)时遇到了问题。我有以下代码:

Data = load 'data/*.txt' using PigStorage() AS(...., date:chararray, .....);

B = foreach 数据 FLATTEN(REGEX_EXTRACT_ALL(date, '"(.)/(.)/(.*)

(.):(.):(.*)"')) AS(月:int,日:int,年:int,小时:int,min:int,秒: int);

--B = 按年份过滤 B==2015;

--B = 按月过滤 B ==1 或月 ==2;

C = foreach B 生成速度,月,日,年,时,分;

使用 PigStorage(',') 将 C 存储到 'data/out_files';

日期格式为 ('2/23/2015 23:56:49')

这工作得很好。但是当我在 B 中使用过滤器(年 ==2015 或月 ==1 或月 ==2)时,此代码不起作用。您知道如何在展平字符串后使用任何字段吗?感谢您的帮助。

【问题讨论】:

【参考方案1】:

你可以试试这个吗?

输入:

2/23/2015 23:56:49
1/23/2014 23:56:49
9/23/2014 23:56:49
8/23/2014 23:56:49

PigScript:

A = LOAD 'input' AS (date:chararray);
B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(date, '([0-9]+)/([0-9]+)/([0-9]+)\\s+([0-9]+):([0-9]+):([0-9]+)')) AS (month,day,year,hour,min,second);
C = FILTER B BY (month==1) OR (month==2) OR (year==2015);
D = FOREACH C GENERATE month,day,year,hour,min,second;
DUMP D;

输出:

(2,23,2015,23,56,49)
(1,23,2014,23,56,49)

下面的正则表达式也可以。

B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(date, '(\\d+)/(\\d+)/(\\d+)\\s+(\\d+):(\\d+):(\\d+)')) AS (month,day,year,hour,min,second);

【讨论】:

谢谢 Sivasakthi,我仍然收到错误,无法将 bytearray 转换为 int。这是由于 C = FILTER B BY year==2015。当我将年份更改为 int 时,仍然得到相同的先前错误。 默认情况下,pig 会将 bytearray 转换为 int 作为隐式类型转换的一部分,所以这应该可以工作。我在上面的脚本中没有遇到任何问题,你提到的两个过滤器语句对我来说都很好。你能关闭你的终端,再次打开它并重新运行脚本吗? (我用的是 Pig 0.13 版本。)

以上是关于展平字符串后 Pig 中的模式的主要内容,如果未能解决你的问题,请参考以下文章

Apache Pig:组操作后去除命名空间前缀 (::)

展平 python 数据框中的条目,如 Apache PIG 包

如何使用 Hive/Pig/MapReduce 展平递归层次结构

Apache Pig Group / 展平 / 加入

Apache Pig - 在脚本中多次调用 Java UDF ToJSON

Pig中的双冒号到底是啥意思?