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 - 如何操作和比较日期?的主要内容,如果未能解决你的问题,请参考以下文章