AWS Athena. Не удается использовать CSV-манифест в качестве местоположения

#amazon-web-services #csv #amazon-s3 #manifest #amazon-athena

#amazon-web-services #csv #amazon-s3 #манифест #amazon-athena

Вопрос:

Я пытаюсь создать внешнюю таблицу в 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, поскольку мне нужно всего несколько записей

Ответ №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 Select для запроса определенных столбцов в этих файлах по одному за раз. Используя AWS CLI, команда для извлечения 2-го столбца будет выглядеть примерно так:

 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)