Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 通过Boto3使用S3 Bucket中多个文件夹中的所有对象在Athena中创建表_Python 3.x_Amazon Web Services_Amazon S3_Boto3_Amazon Athena - Fatal编程技术网

Python 3.x 通过Boto3使用S3 Bucket中多个文件夹中的所有对象在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存储桶有多个子目录,根据日期存储多个网站的数据。 例子: bucket/2020-01-03/website 1和其中存储csv的位置。 我可以根据每个对象创建表,但我想为所有网站以及所有其他日期的所有子目录/对象/存储在前缀bucket/2020-01-03中的数据创建一个合并表

我使用下面的代码为

雅典娜构型 Athena数据库和表定义
我还想在每次运行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'
);
在此情况下,每一个雅典娜查询都会扫描 S3://Buffs<代码>位置的所有文件,并且可以使用<代码> WebSITeSIDID/COD>和日期>代码> <子句来过滤结果。但是,如果你有很多数据要考虑的话,它不仅可以节省你执行查询的时间,还可以节省钱(见)

我还想在每次运行S3时用S3中的新数据重写这个表


我假设您的意思是,每次运行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'})