从 PIG 中的数据中获取 MIN EFF_DT 和 MAX_CANC_dt

Posted

技术标签:

【中文标题】从 PIG 中的数据中获取 MIN EFF_DT 和 MAX_CANC_dt【英文标题】:Take MIN EFF_DT and MAX_CANC_dt from data in PIG 【发布时间】:2017-04-04 15:50:31 【问题描述】:

架构:

TYP|ID|RECORD|SEX|EFF_DT|CANC_DT

DMF|1234567|98765432|M|2011-08-30|9999-12-31
DMF|1234567|98765432|M|2011-04-30|9999-12-31
DMF|1234567|98765432|M|2011-04-30|9999-12-31

假设我有多个这样的记录。我只想显示具有最小 eff_dt 和最大取消日期的记录。

我只想显示这 1 条记录

DMF|1234567|98765432|M|2011-04-30|9999-12-31

谢谢

【问题讨论】:

【参考方案1】:

获取 min eff_dt 和 max canc_dt 并使用它来过滤关系。假设你有一个关系 A

B = GROUP A ALL;
X = FOREACH B GENERATE MIN(A.EFF_DT);
Y = FOREACH B GENERATE MAX(A.CANC_DT);

C = FILTER A BY ((EFF_DT == X.$0) AND (CANC_DT == Y.$0));
D = DISTINCT C;
DUMP D; 

【讨论】:

如果我有多个这样的记录,最小 eff_dt 和最大 canc_dt 不同,这会起作用吗? @pd123 自己试试看 谢谢。工作。也想出了一个新办法。【参考方案2】:

假设您有这些数据(此处为示例):

DMF|1234567|98765432|M|2011-08-30|9999-12-31
DMF|1234567|98765432|M|2011-04-30|9999-12-31
DMF|1234567|98765432|M|2011-04-30|9999-12-31
DMX|1234567|98765432|M|2011-12-30|9999-12-31
DMX|1234567|98765432|M|2011-04-30|9999-12-31
DMX|1234567|98765432|M|2011-04-01|9999-12-31

执行以下步骤:

-- 1. Read data, if you have not 
 A = load 'data.txt' using PigStorage('|') as (typ: chararray, id:chararray, record:chararray, sex:chararray, eff_dt:datetime, canc_dt:datetime);

-- 2. Group data by the attribute you like to, in this case it is TYP
grouped = group A by typ;

-- 3. Now, generate MIN/MAX for each group. Also, only keep relevant fields
min_max = foreach grouped generate group, MIN(A.eff_dt) as min_eff_dt, MAX(A.canc_dt) as max_canc_dt;

-- 
dump min_max;
(DMF,2011-04-30T00:00:00.000Z,9999-12-31T00:00:00.000Z)
(DMX,2011-04-01T00:00:00.000Z,9999-12-31T00:00:00.000Z)

如果需要,将 datetime 更改为 charrary。

注意:有不同的方法可以做到这一点,我所展示的,除了加载步骤,它分两步产生所需的结果:GROUP 和 FOREACH。

【讨论】:

以上是关于从 PIG 中的数据中获取 MIN EFF_DT 和 MAX_CANC_dt的主要内容,如果未能解决你的问题,请参考以下文章

如何验证pig中的数据类型?

如何从 apache pig 中的 part-r-0000 获取输出

使用 Apache Pig 从文本文件中获取备用行

用于计算 emp 时间的 Min、Max 的 Pig 脚本

使用 Pig latin 从文件中获取最大日期

使用 Sqoop 将来自 MySQL 的数据加载到 PIG