Python 3.x 通过Boto3使用S3 Bucket中多个文件夹中的所有对象在Athena中创建表
我的S3存储桶有多个子目录,根据日期存储多个网站的数据。 例子: bucket/2020-01-03/website 1和其中存储csv的位置。 我可以根据每个对象创建表,但我想为所有网站以及所有其他日期的所有子目录/对象/存储在前缀bucket/2020-01-03中的数据创建一个合并表 我使用下面的代码为 雅典娜构型 Athena数据库和表定义Python 3.x 通过Boto3使用S3 Bucket中多个文件夹中的所有对象在Athena中创建表,python-3.x,amazon-web-services,amazon-s3,boto3,amazon-athena,Python 3.x,Amazon Web Services,Amazon S3,Boto3,Amazon Athena,我的S3存储桶有多个子目录,根据日期存储多个网站的数据。 例子: bucket/2020-01-03/website 1和其中存储csv的位置。 我可以根据每个对象创建表,但我想为所有网站以及所有其他日期的所有子目录/对象/存储在前缀bucket/2020-01-03中的数据创建一个合并表 我使用下面的代码为 雅典娜构型 Athena数据库和表定义 我还想在每次运行S3时使用S3中的新数据重写此表。只有在S3上的不同“目录”中的文件都遵循相同的数据模式时,才能为它们创建一个合并表。正如我从您的创
我还想在每次运行S3时使用S3中的新数据重写此表。只有在S3上的不同“目录”中的文件都遵循相同的数据模式时,才能为它们创建一个合并表。正如我从您的
创建外部表
中看到的,每个文件包含4列网站id
,用户
,操作
和日期
。因此,您只需更改位置
即可指向S3“目录结构”的根
创建外部表(如果不存在)`database1`.`consolidated_TABLE`(
`网站_id“字符串注释”来自反序列化程序“,
`来自反序列化程序“”的用户“字符串注释”,
`来自反序列化程序的操作“字符串注释”,
`来自反序列化程序的日期“字符串注释”
)
行格式SERDE'org.apache.hadoop.hive.serde2.OpenCSVSerde'
具有serdeproperty(
“escapeChar”=“\\”,“separatorChar”=“,”
)
位置“s3://bucket”——而不是将其限制为s3://bucket/2020-01-03/website1
TBLProperty(
'跳过.header.line.count'='1'
);
在此情况下,每一个雅典娜查询都会扫描我假设您的意思是,每次运行Athena查询时,它都应该扫描S3上的文件,即使这些文件是在您执行
CREATE EXTERNAL TABLE
后添加的。请注意,CREATE EXTERNAL TABLE
只是定义了有关您的数据的元信息,即它在S3上的位置、列等。因此,使用LOCAT对表进行查询当你说覆盖时,ION's3://bucket'
(w/o分区)将始终包括所有s3文件你是说s3中的现有文件被新记录修改了,还是说它将是全新的数据?
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'
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'})