Создайте таблицу в Афине, используя все объекты из нескольких папок в S3 Bucket через Boto3 - PullRequest
0 голосов
/ 07 января 2020

My S3 Bucket имеет несколько подкаталогов, в которых хранятся данные для нескольких веб-сайтов в зависимости от дня. пример: bucket / 2020-01-03 / website 1 и в этом месте хранятся csv. Я могу создавать таблицы на основе каждого из объектов, но хочу создать одну консолидированную таблицу для всех подкаталогов / объектов / данных, хранящихся в префиксе bucket / 2020-01-03 для всех веб-сайтов, а также для всех других дат.

Я использовал приведенный ниже код для создания одной таблицы для

Конфигурация Athena

athena = boto3.client('athena',aws_access_key_id=ACCESS_KEY,aws_secret_access_key=SECRET_KEY, 
region_name= 'us-west-2')
s3_input = 's3://bucket/2020-01-03/website1'

database = 'database1'
table = 'consolidated_table'

Определение базы данных и таблицы Athena

create_table = \

 """CREATE EXTERNAL TABLE IF NOT EXISTS `%s.%s` (
  `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 '%s'
     TBLPROPERTIES (
  'skip.header.line.count'='1', 
  'transient_lastDdlTime'='1576774420');""" % ( database, table, s3_input )

athena.start_query_execution(QueryString=create_table, 
WorkGroup = 'user_group',
QueryExecutionContext={'Database': 'database1'},
ResultConfiguration={'OutputLocation': 's3://aws-athena-query-results-5000-us-west-2'})

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

1 Ответ

0 голосов
/ 07 января 2020

Вы можете иметь консолидированную таблицу для файлов из разных «каталогов» на 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

...