АВС Афина. Невозможно использовать манифест CSV в качестве местоположения

Я пытаюсь создать внешнюю таблицу в Athena, проблема в том, что в корзине s3 есть разные файлы в одной папке, поэтому я не могу использовать папку в качестве местоположения.

Я не могу изменить путь к файлам s3, но у меня есть манифест CSV, я пытался использовать его как местоположение, но Athena не позволила мне это сделать.

CREATE EXTERNAL TABLE `my_DB`.`my_external_table`(
    column1 string,
    column2 string
  )
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
   'separatorChar' = ',',
   'quoteChar' = '\"',
   'escapeChar' = '\\'
   )
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://mys3bucket/tables/my_table.csvmanifest'
TBLPROPERTIES (
  'has_encrypted_data'='false', 
  'skip.header.line.count'='1')

Есть идеи, как использовать мой манифест? или другой способ решить эту проблему без Афины? Целью использования Athena было избежать получения всех данных из CSV, поскольку мне нужно всего несколько записей.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 027
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно будет внести пару изменений в заявление CREATE TABLE:

  1. используйте 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat' как свой INPUTFORMAT
  2. Убедитесь, что вы указываете на папку с вашим заявлением LOCATION

Таким образом, ваше заявление будет выглядеть так:

CREATE EXTERNAL TABLE `my_DB`.`my_external_table`(
    column1 string,
    column2 string
  )
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
   'separatorChar' = ',',
   'quoteChar' = '\"',
   'escapeChar' = '\\'
   )
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://mys3bucket/tables/my_table/'

И s3://mys3bucket/tables/my_table/ будет иметь один файл с путями S3 файлов CSV, которые вы хотите запросить — один путь в строке. Я не уверен, будет ли параметр skip.header.line.count работать с самим файлом манифеста или файлами CSV, поэтому вам придется проверить.

В качестве альтернативы, если у вас есть ограниченное количество файлов, вы можете использовать S3 Выберите для запроса определенных столбцов в этих файлах по одному за раз. Используя интерфейс командной строки AWS, команда для извлечения второго столбца будет выглядеть примерно так:

aws s3api select-object-content \
  --bucket mys3bucket \
  --key path/to/your.csv.gz \
  --expression "select _2 from s3object limit 100" \
  --expression-type SQL \
  --input-serialization '{"CSV": {}, "CompressionType": "GZIP"}' \
  --output-serialization '{"CSV":{}}' \
  sample.csv

(Отказ от ответственности: сотрудник AWS)

Другие вопросы по теме