展平字符串后 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 中的模式的主要内容,如果未能解决你的问题,请参考以下文章
展平 python 数据框中的条目,如 Apache PIG 包
如何使用 Hive/Pig/MapReduce 展平递归层次结构