Apache Pig от метки времени до даты

Я пытаюсь проанализировать некоторые данные с помощью apache pig в амабари.

В этом конкретном случае у меня проблема... У меня есть столбец с отметкой времени, написанный в этом конкретном формате

1433306146000

1422814565122

с онлайн-конвертером, если я введу 1433306146000, вывод будет 30/08/47389 @ 12:06pm (UTC), но это не так, на самом деле, если я вручную удалю последние 3 числа (1433306146), результат будет 03/06 /2015 в 4:35 (UTC).

Итак, в свинье есть способ удалить эти последние 3 числа в столбце меток времени? А также главный вопрос: с функцией

GetDay(дата/время)

если я передам временную метку, это сработает? или есть другой способ получить из временной метки соответствующий день недели?

Спасибо


person Fraangel    schedule 14.05.2016    source источник


Ответы (3)


Не уверен, какой преобразователь вы использовали для своих временных меток, но здесь он показывает правильный формат. Оператор ToDate не работает со сложными типами данных, такими как сумка. Вот почему вы получаете сообщение об ошибке при попытке использовать его в группе. Также иногда поведение с chararrays непредсказуемо, поэтому эмпирическое правило заключается в использовании длинного примитивного типа для временных меток. Код ниже должен работать.

input=LOAD '..Fra/data/prova/*' AS(old_timestamp:long,timestamp:long);
result=FOREACH input GENERATE 
  GetDay(ToDate(old_timestamp)),
  GetDay(ToDate(timestamp));
DUMP result; 

Также вы также можете, очевидно, перевести из chararray в long в вашем случае, если вы не хотите менять схему. Только это изменится:

result=FOREACH input GENERATE 
  GetDay(ToDate((long)old_timestamp)),
  GetDay(ToDate((long)timestamp));

Также будьте осторожны, что ToDate ВСЕГДА нужны миллисекунды, поэтому, если вы отрежете их, вы ожидаете увидеть время запуска Unix по умолчанию 1970-01-01 Ура!

person madbitloman    schedule 19.05.2016
comment
Спасибо за ответ! полученный результат - это месячный день (от 1 до 31), но если мне нужны только дни недели (от 1 до 7)? например 1 воскресенье... что я могу сделать? - person Fraangel; 19.05.2016
comment
Вы можете либо использовать макрос для преобразования дня в число, либо пойти жестоким путем и использовать 7 условных операторов. - person madbitloman; 19.05.2016
comment
как я могу его использовать? Я новичок... но я попробовал этот способ. - person Fraangel; 20.05.2016
comment
Не получится, так как вы хотите получить именно будний день. Я предлагаю написать Python (более простой) UDF для извлечения того, что вы хотите. Есть много примеров. - person madbitloman; 20.05.2016

У вас есть смещение от 1970-01-01T00:00:00.000Z в миллисекундах. Вы можете передать эти миллисекунды в ToDate. Он принимает временную метку Unix в качестве входных данных и возвращает объект даты и времени. Как только вы получите объект datetime, вы можете использовать функцию GetDay. Нет необходимости удалять последние 3 числа.

GetDay(ToDate(1433306146000))

Примечание. Если вы действительно хотите удалить 3 числа, загрузите данные в виде массива символов и используйте ПОДСТРОКА.

person VK_217    schedule 14.05.2016
comment
Привет @inquisitive_mind спасибо за ответ! Я пытался сделать что-то вроде этого y=LOAD '../Fra/mydata/* ' AS (user_id:chararray,event_id:chararray,timestamp:chararray); grp= группа y по метке времени; результат = foreach grp{ GetDay(ToDate(grp); } результат дампа; Первый вопрос в том, как временная метка распознается свинкой, я предположил, что это chararray, Второй вопрос в том, что есть ошибка (может быть, не одна, извините, но я нуб ) исключение при разборе... не могли бы вы помочь мне решить проблему?Спасибо - person Fraangel; 16.05.2016
comment
Результат @Fraangel = foreach grp generate GetDay (ToDate (group)); дамп результата; - person VK_217; 17.05.2016
comment
Я отвечаю вам в качестве комментария, потому что текст был слишком длинным - person Fraangel; 18.05.2016

@inquisitive_mind Я попробовал полную строку (включая смещение), но это не сработало, ошибка:

"неверный формат 1422762920000 имеет неверный формат 0000"

поэтому я попытался использовать подстроку таким образом

SUBSTRING grp = FOREACH y GENERATE (timestamp),SUBSTRING(timestamp,0,9);

а затем я сохранил его в новый файл, чтобы свободно манипулировать им. На выходе было два столбца: в первом это была исходная метка времени, во втором - новая метка времени без последних трех символов, поэтому я попытался запустить этот новый скрипт:

y=LOAD '..Fra/data/prova/*' as (old_timestamp:chararray,timestamp:chararray);
grp=group y by timestamp;
result=foreach grp generate GetDay(ToDate(group));
dump result;

вывод:

"... недопустимый формат 1422762920 искажен в 0"

Поэтому, даже если бы я знал, что при удалении другого символа из предыдущего кода я бы попробовал, поэтому я изменил диапазон функции подстроки (отметка времени, 0,10). И теперь я попытался перезапустить скрипт, но результат получился (1), (1), (1), (1), (1), я в отчаянии!

person Fraangel    schedule 18.05.2016