AWS Athena (Presto с JsonSerde) тихо завершает работу с некоторыми именами столбцов, какие из них приемлемы? - PullRequest
0 голосов
/ 30 апреля 2018

Я пытался создать эту простую таблицу в Афинах:

CREATE EXTERNAL TABLE ctc.rets (
  `SystemID` string,
  `blah` string
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
  'mapping.SystemID' = 'L_ListingID',
  'mapping.blah' = 'Ext_Char10_11' 
) 
LOCATION 's3://xyz.bucket/mydata/'
TBLPROPERTIES ('has_encrypted_data'='false');

Поле с именем blah отображается нормально, но поле с именем SystemID отображается пустым в каждой строке.

А потом становится действительно интересно:

  • Я изменяю имя поля SystemID на WTF, или foobar, или strawberry, и оно отлично работает (данные отображаются).
  • Я изменяю имя поля SystemID на _SystemID, f_SystemID, ystemID, System_I_D и , ни одно из них не работает

Никогда не появляется сообщение об ошибке.

Каковы действительные правила, которым необходимо следовать для имен полей?

1 Ответ

0 голосов
/ 30 апреля 2018

Обычно сопоставление с SerDe выполняется для сопоставления зарезервированного имени поля с незарезервированным. Шаблон ниже:

WITH SERDEPROPERTIES (
  'mapping.NON_RESERVED_KEYWORD' = 'RESERVED_KEYWORD'
)

Реальный пример из github :

CREATE TABLE mytable (
    myfield string, ts string
) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( "mapping.ts" = "timestamp" )
STORED AS TEXTFILE;

Сопоставление выполняется как timestamp зарезервированное ключевое слово.

У вас регистр System_ID должен быть перевернут. Кроме того, я проверил в Руководстве по кустам и System_ID не зарезервированное ключевое слово.

ОБНОВЛЕНИЕ ОП : После некоторых дополнительных экспериментов я также решил, что вы не можете использовать смешанный регистр в NON_RESERVED_KEYWORD. Все прописные или строчные в порядке.

...