AWS Афина.Не могу использовать манифест CSV в качестве местоположения - PullRequest
0 голосов
/ 09 апреля 2019

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

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

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 Ответ

0 голосов
/ 09 апреля 2019

Вам необходимо внести пару изменений в ваше заявление 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 команда для извлечения 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)

...