我正在开展一个项目,要求我找到多个数据集的时间平均值(例如:小时,天,月),然后对这些平均值进行计算。我遇到的问题是Apache Pig不会按时分组,也不会转储DateTime值。我已经尝试过在Stack Overlflow和其他地方发布的几个解决方案无济于事。我也阅读了文档,但无法找到解决方案。
到目前为止,这是我的代码:
data = LOAD 'TestData' USING PigStorage(',');
t_data = foreach data generate (chararray)$0 as date, (double)$305 as w_top, (double)$306 as t_top, (double)$310 as w_mid, (double)$311 as t_mid, (double)$315 as w_bot, (double)$316 as t_bot, (double)$319 as pressure;
times = FOREACH t_data GENERATE ToDate(date,'YYYY-MM-ddThh:mm:ss.s') as (date), w_top, t_top, w_mid, t_mid, w_bot, t_bot, pressure;
grp_hourly = GROUP times by GetHour(date);
average = foreach grp_hourly generate flatten(group), times.date, AVG(times.w_top), AVG(times.t_top), AVG(times.w_mid), AVG(times.t_mid), AVG(times.w_bot), AVG(times.t_bot);
来自数据的一些示例行:
2011-01-06 15:00:00.0 ,0.07225,-11.36384,-0.045,-11.24599,0.036,-12.44104,1021.707
2011-01-06 15:00:00.1 ,0.09975,-11.34448,-0.0325,-11.26053,0.041,-12.45392,1021.694
2011-01-06 15:00:00.2 ,0.15375,-11.35576,-0.02975,-11.26536,0.01025,-12.44748,1021.407
2011-01-06 15:00:00.3 ,-0.00225,-11.42034,-0.03775,-11.28477,-0.013,-12.44429,1021.764
2011-01-06 15:00:00.4 ,0.01625,-11.33965,-0.0395,-11.27989,-0.0395,-12.42172,1021.484
我目前获得的输出结果:
我得到一个文件,其中包含每个变量的平均值,我提供给APACHE Pig而没有日期和时间(很可能是整个数据集中每个变量的平均值)。我每小时都需要它们并打印输出。任何提示将不胜感激。对不起,如果我的帖子很乱,我不会经常发布Stack Overflow。
答案 0 :(得分:0)
ToDate
中的日期和时间模式字符串与您的数据不完全匹配。您有YYYY-MM-ddThh:mm:ss.s
,但您的数据看起来像2011-01-06 15:00:00.0
。您需要匹配数据中的空格,并且由于您的工作时间是24小时,因此您需要使用HH
而不是hh
。查看Java SimpleDateFormat class的文档。请尝试使用此模式字符串:
times = FOREACH t_data GENERATE ToDate(date,'yyyy-MM-dd HH:mm:ss.s ') as date;
要调试代码,请在创建关系times
之后立即尝试转储,而不是在最后,因为问题似乎是ToDate()
。
答案 1 :(得分:0)
(date,'YYYY-MM-ddThh:mm:ss.s')
应该这样写:
(date,'YYYY-MM-ddThh:mm:ss.s ')