Вы можете иметь консолидированную таблицу для файлов из разных «каталогов» на S3, только если все они придерживаются одной и той же схемы данных. Как я вижу из вашего CREATE EXTERNAL TABLE
, каждый файл содержит 4 столбца website_id
, user
, action
и date
. Таким образом, вы можете просто изменить LOCATION
, чтобы он указывал на root вашей "структуры каталогов" S3
CREATE EXTERNAL TABLE IF NOT EXISTS `database1`.`consolidated_table` (
`website_id` string COMMENT 'from deserializer',
`user` string COMMENT 'from deserializer',
`action` string COMMENT 'from deserializer',
`date` string COMMENT 'from deserializer'
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'escapeChar'='\\"', 'separatorChar'=','
)
LOCATION 's3://bucket' -- instead of restricting it to s3://bucket/2020-01-03/website1
TBLPROPERTIES (
'skip.header.line.count'='1'
);
В этом случае каждый запрос Athena будет сканировать все файлы в расположении s3://bucket
, и вы можете используйте website_id
и date
в предложении WHERE
для фильтрации результатов. Однако, если у вас много данных, вам следует рассмотреть разбиение . Это сэкономит вам не только время на выполнение запроса, но и деньги (см. этот пост )
Я также хочу перезаписывать эту таблицу новыми данными из S3 каждый раз, когда я запустите его.
Я предполагаю, что вы имеете в виду, что каждый раз, когда вы запускаете запрос Athena, он должен сканировать файлы на S3, даже если они были добавлены после того, как вы выполнили CREATE EXTERNAL TABLE
. Обратите внимание, что CREATE EXTERNAL TABLE
просто определяет метаинформацию о ваших данных, т. Е. Где они расположены на S3, столбцы и т. Д. c. Таким образом, запрос к таблице с LOCATION 's3://bucket'
(без разбиения) всегда будет включать все ваши файлы S3