Я пытаюсь создать внешнюю таблицу в 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, поскольку мне нужно всего несколько записей.
Вам нужно будет внести пару изменений в заявление CREATE TABLE
:
'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat'
как свой INPUTFORMAT
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)