Ошибка при создании таблицы с именем столбца, содержащим точку (.) В 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 в AWSGlue, все работает нормально, и я вижу столбец с точками в нем.
Независимо от того, как создаются таблицы, процесс создания таблиц регистрирует набор данных в Athena. Эта регистрация происходит в каталоге данных AWSGlue и позволяет Athena выполнять запросы к данным.
Итак, AWS Athena негласно использует AWSGlue, и если сканер Glue может добавлять столбцы, содержащие точки (.) В ключе JSON, почему запрос Athena не может этого сделать.
Может, я что-то упускаю. Итак, если кто-то испытал что-то подобное в прошлом и решил проблему, пожалуйста, просветите меня. И если невозможно сделать то, что я пытаюсь сделать, выделите, пожалуйста, и это, чтобы я не тратил время зря.
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 нормально работает с аналогичными данными, вы можете найти схему, созданную с помощью SHOW CREATE TABLE