синтаксис presto для внешней таблицы csv с массивом в одном из полей - PullRequest
0 голосов
/ 06 ноября 2019

У меня проблемы с созданием таблицы в Афине, которая указывает на файлы следующего формата: строка, строка, строка, массив.

когда я писал файл - я разделил элементы массива с помощью '|». Я ограничил каждую строку с помощью '\ n', а каждый столбец - с помощью ','.

, поэтому, например, строка в моем CSV будет выглядеть так:

Garfield, 15, orange, fish|milk|lasagna

в кусте (согласно документации, которую я прочитал) - при создании таблицы в формате с разделителями строк - при указании разделителей можно указать разделитель «элементов коллекции», который устанавливает разделитель между элементами в столбцах массива. Я не смог найти эквивалент для Presto в документации:

Кто-нибудь знает, возможно ли это, если да - какой формат или где я могу его найти?

Я пытался «угадать» множество форм, включая «предметы коллекции», ни одна из которых, похоже, не сработала.

CREATE EXTERNAL TABLE `cats`(
  `name` string, 
  `age` string, 
  `color` string, 
  `foods` array<string>)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ',' 
  LINES TERMINATED BY '\n' 
  COLLECTION ITEMS TERMINATED BY '|'
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'some-location'

Буду очень признателен за любые идеи, спасибо! :)

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

(Примечание: этот ответ применим к Presto в целом, но не к Athena)

В настоящее время нельзя установить разделитель коллекции в Presto. Создайте запрос функции @ https://github.com/prestosql/presto/issues/

Обратите внимание, что мы планируем предоставить общую поддержку свойств таблицы для комплексного рассмотрения таких случаев - https://github.com/prestosql/presto/issues/954. Вы можете отслеживать проблему и связанныезапрос на получение обновлений .

0 голосов
/ 06 ноября 2019

Согласно документам AWS Athena на с использованием SerDe , ваше предположение было на 100% правильным.

В общем, Athena использует LazySimpleSerDe, если вы не указали ROW FORMATили, если вы укажете ROW FORMAT DELIMITED

ROW FORMAT
DELIMITED FIELDS TERMINATED BY ','
ESCAPED BY '\\'
COLLECTION ITEMS TERMINATED BY '|'
MAP KEYS TERMINATED BY ':'

Теперь, когда я просто попробую ваше утверждение DDL, я получу

line 1:8: no viable alternative at input 'create external'

Однако, удалив LINES TERMINATED BY '\n', яудалось создать схему таблицы в мета-каталоге

CREATE EXTERNAL TABLE `cats`(
  `name` string, 
  `age` string, 
  `color` string, 
  `foods` array<string>)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ',' 
  COLLECTION ITEMS TERMINATED BY '|'
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'some-location'

Пример файла со строками, как показано в вашем файле, будет проанализирован правильно, и я смог сделать UNNEST в столбце foods:

SELECT * 
FROM "cats" 
CROSS JOIN UNNEST(foods) as t(food)

, что привело к sample_result

Более того, было достаточно просто поменять строки LINES TERMINATED BY '\n' и COLLECTION ITEMS TERMINATED BY '|' для выполнения запроса (хотя я неесть объяснение этому)

CREATE EXTERNAL TABLE `cats`(
  `name` string, 
  `age` string, 
  `color` string, 
  `foods` array<string>)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ','   
  COLLECTION ITEMS TERMINATED BY '|'
  LINES TERMINATED BY '\n' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'some-location'
...