Ошибка при создании таблицы с именем столбца, содержащим точку (.) В Amazon Athena, даже после экранирования точки с помощью обратных кавычек (`)

Согласно https://docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html,

Специальные символы

Специальные символы, кроме подчеркивания (_), не поддерживаются. Дополнительные сведения см. В документации DDL Apache Hive LanguageManual.

Важно

Хотя вы можете успешно создать имена таблиц, представлений, баз данных или столбцов, содержащие специальные символы, отличные от подчеркивания, заключив их в символы обратной кавычки (`), последующие запросы DDL или DML, которые ссылаются на них, могут завершиться ошибкой.

Итак, я попытался создать таблицу, используя файл JSON, хранящийся в ведре S3, и один из ключей в JSON содержит несколько точек (.), Что, согласно информации, указанной в ссылке, должно быть хорошо, если я использовал обратные кавычки (`) чтобы избежать этого.

CREATE EXTERNAL TABLE json_table (
id string,
version string,
com`.`org`.`dto`.`Customer string )
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ('ignore.malformed.json' = 'true')
LOCATION 's3://narendra-damodardas-modi-test-data/';

Но это дает следующую ошибку:

line 1:8: no viable alternative at input 'create external' (service: amazonathena; status code: 400; error code: invalidrequestexception; request id: ef586f31-2515-4faa-a9fe-3a0e418235d2)

Теперь вы можете сказать, что согласно предоставленной ссылке, очевидно, что это не сработает, но когда я делаю это через Crawler в AWS Glue, все работает нормально, и я вижу столбец с точками в нем.

Согласно https://docs.aws.amazon.com/athena/latest/ug/understanding-tables-databases-and-the-data-catalog.html,

Независимо от того, как создаются таблицы, процесс создания таблиц регистрирует набор данных в Athena. Эта регистрация происходит в каталоге данных AWS Glue и позволяет Athena выполнять запросы к данным.

Итак, AWS Athena использует AWS Glue за кулисами, и если сканер Glue может добавлять столбцы, содержащие точки (.) В ключе JSON, почему запрос Athena не может этого сделать.

Может, я что-то упускаю. Итак, если кто-то испытал что-то подобное в прошлом и преодолел проблему, пожалуйста, просветите меня. И если невозможно сделать то, что я пытаюсь сделать, выделите, пожалуйста, и это, чтобы я не тратил время зря.


person Narendra Damodardas Modi    schedule 26.06.2020    source источник


Ответы (1)


Вам нужно использовать обратные галочки вокруг всего объекта, а не только вокруг специальных символов. Следующее должно работать

CREATE EXTERNAL TABLE json_table (
  `id` string,
  `version` string,
  `com.org.dto.Customer` string
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
  'ignore.malformed.json' = 'true'
)
LOCATION 's3://narendra-damodardas-modi-test-data/';

В общем, я бы посоветовал заключить все имена столбцов в кавычки.

Также, если ваш AWS Glue Crawler нормально работает с аналогичными данными, вы можете найти схему, созданную им с помощью _ 2_

person Ilya Kisil    schedule 26.06.2020