Не удается сгруппировать дату и время по часам или дампам результатов Apache Pig - PullRequest
0 голосов
/ 25 апреля 2018

Я работаю над проектом, который требует, чтобы я нашел среднее временное значение (например, час, день, месяц) для нескольких наборов данных, а затем выполняю вычисления для этих средних.Проблема, с которой я сталкиваюсь, заключается в том, что Apache Pig не будет группировать по времени и не сбрасывать значения DateTime.Я пробовал несколько решений, размещенных здесь, на переполнении стека и в других местах, но безрезультатно.Я также перечитал документацию и не могу найти решение.

Вот мой код на данный момент:

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.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Дикарь ответил правильно.Проблема в моем коде заключалась в кавычках, которые были слишком близки к строке даты и времени.Таким образом, вместо того, чтобы писать мой, как это:

(date,'YYYY-MM-ddThh:mm:ss.s')

Это должно быть написано так:

(date,'YYYY-MM-ddThh:mm:ss.s ')
0 голосов
/ 25 апреля 2018

Строка шаблона даты и времени в 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...