Apache Pig от отметки времени до настоящего времени

Я пытаюсь проанализировать некоторые данные с Apache свинья в Amabari

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

1433306146000

1422814565122

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

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

GetDay(DateTime)

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

Спасибо

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.

@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"

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

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

GetDay(ToDate(1433306146000))

Примечание. Если вы действительно хотите удалить 3 числа, загрузите данные как chararray и используйте функцию SUBSTRING.

Другие вопросы по тегам