在生成语句中格式化日期
Posted
技术标签:
【中文标题】在生成语句中格式化日期【英文标题】:Formatting Date in Generate Statement 【发布时间】:2013-05-25 13:05:56 【问题描述】:在 Pig 中,我有一个语句,它基本上将日期附加到我生成的值中。
Data = FOREACH Input GENERATE (CurrentTime()),FLATTEN(group), COUNT(guid)oas Cnt;
输出为我提供了 ISO8601 中的日期 2013-05-25T09:01:38.914-04:00
。
我怎样才能像"YYYY-MM-DD"
一样做到这一点?
【问题讨论】:
【参考方案1】:您有多种选择:
用 Pig 函数转换它: 例如:
A = load ...
B = foreach A
currTime = CurrentTime();
year = (chararray)GetYear(currTime);
month = (chararray)GetMonth(currTime);
day = (chararray)GetDay(currTime);
generate CONCAT(CONCAT(CONCAT(year, '-'), CONCAT(month, '-')),day) as myDate;
或者将日期作为参数传递给脚本:
pig -f script.pig -param CURR_DATE=`date +%Y-%m-%d`
或者在脚本中声明它:
%declare CURR_DATE `date +%Y-%m-%d`;
然后在脚本中将变量称为'$CURR_DATE'
。
您还可以创建一个已修改 CurrentTime UDF,您可以在其中使用Joda-Time 库将 DateTime 对象转换为适当的格式。
最简单的方法是在脚本开头声明日期。
【讨论】:
嘿洛兰,谢谢你的回复。事实上,我曾尝试将日期作为参数方法传递。但是今天的最终输出显示的是 1983 而不是 2013-05-25。知道为什么吗?相同的输出参数在将其分配给存储文件的名称时可以正常工作。例如: STORE Output INTO 'Outputs$CURR_DATE 工作正常并显示为 Output2013-05-25。 这是因为如果你做减法:2013-5-25 你会得到 1983。这就是我使用引号 ('$CURR_DATE'
) 的原因,这样它将被处理为 chararray 而不是 int。
【参考方案2】:
如果您使用的是 Pig 0.12 或更高版本,则可以使用 ToString(CurrentTime(),'yyyy-MM-dd')
您可以使用任何日期时间类型来代替 CurrentTime()
请参阅http://pig.apache.org/docs/r0.12.0/func.html#to-string 了解日期时间格式。
【讨论】:
以上是关于在生成语句中格式化日期的主要内容,如果未能解决你的问题,请参考以下文章