Pig - 如何操作和比较日期?

Posted

技术标签:

【中文标题】Pig - 如何操作和比较日期?【英文标题】:Pig - How to manipulate and compare dates? 【发布时间】:2013-06-19 07:41:54 【问题描述】:

我有一个包含以下条目的文件:

1,1,07 2012,07 2013,11,blablabla

前两个字段是 id。第三个是开始日期(月年),第四个是结束日期。第五个字段是这两个日期之间的月数。最后一个字段包含文本。

这是我加载这些数据的猪代码:

f = LOAD 'file.txt' USING PigStorage(',') AS (id1:int, id2:int, date1:chararray, date2:chararray, duration:int, text:chararray);

我想过滤我的文件,以便只保留 date2 从今天起不到三年的条目。猪有可能吗?

谢谢。

【问题讨论】:

可以写一个过滤函数。 Here是Writing Filter Functions的介绍(在本页搜索Writing Filter Functions)。 谢谢,我会看的。 【参考方案1】:

无需编写自定义函数:

在 Pig 0.11 中,您可以使用 ToDate() 函数将 date2 字段从 chararray 转换为 datetime 数据类型,然后使用 YearsBetween() 获取 CurrentTime() 和 date2 之间的差异并根据它进行过滤。例如:

g = FILTER f BY YearsBetween(CurrentTime(),ToDate(date2 + ' 01', 'yyyy MM dd'))<3

【讨论】:

这很有趣。我使用的是 pig 0.4,但我会记住你的解决方案。谢谢。 如果您不能使用 Pig 0.11 的 datetime 数据类型,您可能仍然可以使用 PiggyBank 的 datetime UDF,它可以帮助您将 datetime chararray 字段转换为与 PiggyBank 中其他 UDF 相当的 ISO 日期. @SNeumann 有没有办法在 Pig 的 DateTime 字段上取一个 TOP? @Navneet - 你是什么意思?您可以使用 Pig 的 LIMIT 来获得前 N 个结果(通常在对数据集进行排序后使用)。 DateTime 数据类型是可排序的,因此按它排序不是问题。 是的。我正是这个意思。很抱歉没有清楚地表达它。谢谢!【参考方案2】:

在 pig 11 中,是否支持比较日期时间类型? 例如: 日期1:日期时间

并且过滤器有条件: date1 >= ToDate('1999-01-01')

这个比较是否返回正确的结果?

【讨论】:

【参考方案3】:

如果您卡在 0.11 之前的 Pig 上,请使用 datafu。 他们有一个函数 UnixToIso

DEFINE UnixToISO   org.apache.pig.piggybank.evaluation.datetime.convert.UnixToISO();

【讨论】:

以上是关于Pig - 如何操作和比较日期?的主要内容,如果未能解决你的问题,请参考以下文章

当一个人也有时间时如何比较相等的日期

Pig 比较运算符在 GENERATE 中不起作用

如何在 EF 查询中执行日期比较?

关于SHELL脚本中日期大小的比较

通过高级 SQL 过滤器进行 OBIEE11g 日期操作/比较

Hadoop之Pig