AWS Glue: сканер неверно интерпретирует временные метки как строки. GLUE ETL, предназначенный для преобразования строк в метки времени, делает их NULL

Я поигрался с AWS Glue для быстрой аналитики, следуя руководству здесь

Хотя мне удавалось успешно создавать сканеры и обнаруживать данные в Athena, у меня были проблемы с типами данных, созданными поисковым роботом. Типы данных date и timestamp читаются как типы данных string.

Затем я создал ETL задание в GLUE, используя источник данных, созданный поисковым роботом, в качестве входных данных и целевую таблицу в Amazon S3.

В рамках преобразования отображения я преобразовал типы данных даты и отметки времени как string в timestamp, но, к сожалению, ETL преобразовал эти типы столбцов в NULLS. Я думал об использовании классификаторов с GROK выражениями, но затем решил преобразовать их как часть ETL в GLUE.

Формат метки времени - 1/08/2010 6:15:00 PM.


person Balajee Addanki    schedule 27.08.2018    source источник


Ответы (2)


Я не знаю, какой формат временной метки вы используете, поэтому я предположил, что это следующий формат:

2018-05-30T12:22:07.000Z

В этом случае вы можете установить параметр serde в определении таблицы, как показано ниже:

'timestamp.formats'='yyyy-MM-dd\'T\'HH:mm:ss.SSSZ'
person j.b.gorski    schedule 29.08.2018
comment
Извините, только что обновил свой пост. Я не уверен на 100%, есть ли способ включить это в поисковый робот GLUE. - person Balajee Addanki; 30.08.2018
comment
Я имею в виду определение таблицы в Athena, а не в Glue Crawler. Для вашего формата вы должны использовать 'timestamp.formats' = 'd / MM / yyyy h: mm: ss a' - person j.b.gorski; 30.08.2018
comment
СОЗДАТЬ ВНЕШНЮЮ ТАБЛИЦУ example (col0 строка, col1 строка, col2 отметка времени) СТРОКА ФОРМАТИРОВАТЬ ПОЛЯ РАЗДЕЛЕННЫЕ, ЗАКРЫВАЕМЫЕ '\;' СОХРАНЯЕТСЯ КАК INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3: // example' TBLPROPERTIES ',' c columns '=' true ',' compressType '=' none ',' delimiter '=' \; ',' skip.header.line.count '=' 1 ',' timestamp.formats '=' d / MM / yyyy h : mm: ss a ',' transient_lastDdlTime '=' 1535632231 ',' typeOfData '=' файл ') - person j.b.gorski; 30.08.2018
comment
Спасибо, мне удалось создать внешнюю таблицу в Athena напрямую, используя правильный формат временной метки. Но я предполагаю, что вопрос в том, как заставить краулер определить подходящий data types и сделать результаты доступными для аналитики в Афине. Независимо от того, используете ли вы выражение Grok или выполняете задание ETL для преобразования данных. - person Balajee Addanki; 31.08.2018
comment
@BalajeeAddanki, в таблицах: я установил: 'timestamp.formats' = 'd / MM / yyyy h: mm: ss a' с моими данными выглядит точно так же, как: 1/08/2010 18:15:00 PM однако, когда я установил этот столбец как временную метку и запросил его в Aethan, он показал ошибку, например: IVE_BAD_DATA: Ошибка синтаксического анализа значения поля '1/08/2010 6:15:00 PM' для поля 0: формат временной метки должен быть гггг-мм-дд чч: мм: сс [.fffffffff]. так вы устанавливаете этот столбец как строку или метку времени в таблице? - person EmmaYang; 18.02.2019

Ниже приведены встроенные классификаторы для данных временных меток. Как видите, имеющиеся у вас данные не соответствуют ни одному из них. Вам нужно будет создать собственный классификатор, а затем добавить его в новый сканер (обновление существующего сканера не работает).

 TIMESTAMP_ISO8601 %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?

 TZ (?:[PMCE][SD]T|UTC)

 DATESTAMP_RFC822 %{DAY} %{MONTH} %{MONTHDAY} %{YEAR} %{TIME} %{TZ}

 DATESTAMP_RFC2822 %{DAY}, %{MONTHDAY} %{MONTH} %{YEAR} %{TIME} %{ISO8601_TIMEZONE}

 DATESTAMP_OTHER %{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{TZ} %{YEAR}

 DATESTAMP_EVENTLOG %{YEAR}%{MONTHNUM2}%{MONTHDAY}%{HOUR}%{MINUTE}%{SECOND}

 CISCOTIMESTAMP %{MONTH} %{MONTHDAY} %{TIME}
person Tanveer Uddin    schedule 19.09.2018
comment
Полный список встроенных шаблонов: docs.aws.amazon.com/glue/latest/dg/ - person Daniel; 11.11.2020