hadoop pig 使用日期时间字段加入
Posted
技术标签:
【中文标题】hadoop pig 使用日期时间字段加入【英文标题】:hadoop pig join using datetime field 【发布时间】:2014-07-01 22:14:25 【问题描述】:我有两个数据集
messages.txt
2014-06-23 08:42:34, 34569
2014-06-23 08:42:35, 23945
2014-06-23 08:42:36, 45673
... etc
CPU.txt
2014-06-23 08:42:34, 99
2014-06-23 08:42:35, 80
2014-06-23 08:42:36, 83
... etc
我想使用时间戳加入表格,我想将其格式化为日期时间
这是我的尝试
MSG= load 'messages.txt' using pigstorage(',') as (date_time:chararray, msg_recv:int);
CPU= load 'CPU.txt' using pigstorage(',') as (date_time:chararray, cpu:int);
MSG_FORMATED = foreach MSG GENERATE ToDate(date_time, 'yyyy-MM-dd HH:mm:ss') as date_time, msg_recv;
CPU_FORMATED = foreach CPU GENERATE ToDate(date_time, 'yyyy-MM-dd HH:mm:ss') as date_time, cpu;
到目前为止一切顺利
我可以转储 MSG_FORMATED 和 CPU_FORMATED 并查看它们是日期时间格式
dump MSG_FORMATED;
2014-06-23T08:42:34.000-04:00, 34569
2014-06-23T08:42:35.000-04:00, 23945
2014-06-23T08:42:36.000-04:00, 45673
dump CPU_FORMATED;
2014-06-23T08:42:34.000-04:00, 99
2014-06-23T08:42:35.000-04:00, 80
2014-06-23T08:42:36.000-04:00, 83
现在我尝试加入时遇到问题!
(这应该是相当直接的?)
COMBINED = JOIN MSG_FORMATED BY date_time, CPU_FORMATED by date_time;
describe COMBINED;
COMBINED: MSG_FORMATED::date_time: datetime, MSG_FORMATED::msg_recv: int, CPU_FORMATED::date_time: datetime, CPU_FORMATED::cpu: int
转储组合;
抛出错误
2014-07-01 13:10:23,065 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - Failed!
2014-07-01 13:10:23,065 [main] WARN org.apache.hadoop.mapred.JobConf - The variable mapred.child.ulimit is no longer used.
2014-07-01 13:10:23,070 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 2997: Unable to recreate exception from backed error: AttemptID:attempt_1400260444475_25479_r_000000_3 Info:Error: org.joda.time.DateTime.compareTo(Lorg/joda/time/ReadableInstant;)
【问题讨论】:
有任何解决方案或仍然打开? 【参考方案1】:您可以使用时间戳加入表,然后将其格式化为日期时间。
【讨论】:
所以不能在日期时间加入吗?展望未来,我将拥有格式略有不同的原始时间戳。 toDate 很棒,因为它可以使它们正常化。 是的,我认为 PIG 不喜欢在日期时间加入!如果你想这样做,你可以在 JOIN 之前转换为字符串(chararray)。以上是关于hadoop pig 使用日期时间字段加入的主要内容,如果未能解决你的问题,请参考以下文章