在猪脚本中按日期时间排序
Posted
技术标签:
【中文标题】在猪脚本中按日期时间排序【英文标题】:Order by date time in pig script 【发布时间】:2016-01-12 11:14:02 【问题描述】:pig 0.11.0之后,引入了datetime基本变量类型进行处理。就我而言,我必须按日期时间订购。我是这样用的
data = LOAD 'database_name.table_name' USING org.apache.hcatalog.pig.HCatLoader() AS (id:chararray,name:chararray,birth_date_time:chararray);
selected_data = FOREACH data GENERATE id, name,ToDate(birth_date_time,'yyyy-MM-dd HH:mm:ss') AS birth_date_time;
ordered_data = ORDER selected_data BY birth_date_time DESC;
DUMP ordered_data;
但它不起作用。抛出这个错误
org.apache.pig.impl.logicalLayer.FrontendException:错误 1066:无法 打开别名 cba_ordered 的迭代器。后端错误:无法 从支持的错误重新创建异常: 尝试 ID:attempt_1452577118821_0005_m_000000_3 信息:错误: org.joda.time.DateTime.compareTo(Lorg/joda/time/ReadableInstant;)I 在 org.apache.pig.PigServer.openIterator(PigServer.java:872) 在 org.apache.pig.tools.grunt.GruntParser.processDump(GruntParser.java:774) 在 org.apache.pig.tools.pigscript.parser.PigScriptParser.parse(PigScriptParser.java:372) 在 org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:198) 在 org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:173) 在 org.apache.pig.tools.grunt.Grunt.exec(Grunt.java:84) 在 org.apache.pig.Main.run(Main.java:607) 在 org.apache.pig.Main.main(Main.java:156) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.apache.hadoop.util.RunJar.main(RunJar.java:212) 引起:org.apache.pig.backend.executionengine.ExecException:错误 2997: 无法从支持的错误中重新创建异常: 尝试 ID:attempt_1452577118821_0005_m_000000_3 信息:错误: org.joda.time.DateTime.compareTo(Lorg/joda/time/ReadableInstant;)I 在 org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.Launcher.getErrorMessages(Launcher.java:217) 在 org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.Launcher.getStats(Launcher.java:151) 在 org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher.launchPig(MapReduceLauncher.java:429) 在 org.apache.pig.PigServer.launchPlan(PigServer.java:1324) 在 org.apache.pig.PigServer.executeCompiledLogicalPlan(PigServer.java:1309) 在 org.apache.pig.PigServer.storeEx(PigServer.java:980) 在 org.apache.pig.PigServer.store(PigServer.java:944) 在 org.apache.pig.PigServer.openIterator(PigServer.java:857) ... 12 更多
我们如何按 date_time 字段排序?
【问题讨论】:
也许这只是 SO 的错字,但您以birth_date_time
加载到数据中,然后尝试转换为ToDate(birth_date-time, ...)
。因此,列名最终在 _ 与 - 中有所不同。这不太可能导致错误,但可能值得仔细检查。
这是输入此问题时的拼写错误。我会纠正它。问题是我们可以对日期时间使用 Order 方法吗?
您确定日期转换有效吗?你能提供一些示例输入数据吗?
【参考方案1】:
我会建议你使用 ToUnixTime(datetime) 函数来排序日期列。
请检查下面并这样做。
data = LOAD 'database_name.table_name' USING org.apache.hcatalog.pig.HCatLoader() AS (id:chararray,name:chararray,birth_date_time:chararray);
selected_data = FOREACH data
bdt = (datetime)ToDate(birth_date_time,'yyyy-MM-dd HH:mm:ss');
GENERATE id, name, bdt AS birth_date_time, ToUnixTime(bdt) AS birth_date_time_unix;
;
ordered_data = ORDER selected_data BY birth_date_time_unix DESC;
DUMP ordered_data;
如果有效,请告诉我。
【讨论】:
以上是关于在猪脚本中按日期时间排序的主要内容,如果未能解决你的问题,请参考以下文章