#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
заявление:
- используйте
'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 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)