我需要处理存储桶S3
中特定文件夹中的某些流数据。我想在Python
中这样做。搜索了一段时间后,我发现了库PyAthena
正是我想要的!
我安装了1.8.0
的{{1}}版本。
为供您参考,我的PyAthena
存储桶位于S3
区域,而我的Paris eu-west-3
数据库位于Athena
区域。
我使用了在文档PyAthena Doc中找到的以下代码:
Francfort eu-central-1
起初我不确定要使用哪个from pyathena import connect
cursor = connect(aws_access_key_id='YOUR_ACCESS_KEY_ID',
aws_secret_access_key='YOUR_SECRET_ACCESS_KEY',
s3_staging_dir='s3://YOUR_S3_BUCKET/path/to/',
region_name='us-west-2').cursor()
cursor.execute("SELECT * FROM one_row")
print(cursor.description)
print(cursor.fetchall())
,它应该是region_name
存储桶所在的Paris
中的哪个,还是S3
中的一个Francfort
数据库所在的地方!
我同时尝试了这两种方法,并根据收到的错误消息,最终使用了Athena
存储桶中的一个!
但是,我不断收到有关S3
的权限错误,例如:
Glue
因此,我在pyathena.error.OperationalError: Insufficient permissions to execute the query. Error retrieving table : master in database : default due to : User: arn:aws:iam::<my-account-client-ID>:user/s3-test is not authorized to perform: glue:GetTable on resource: arn:aws:glue:eu-west-3:<my-account-client-ID>:catalog
中添加了以下策略:
IAM
现在我收到此错误消息:
{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": [
"athena:StartQueryExecution",
"athena:GetQueryResultsStream",
"athena:GetQueryResults",
"athena:DeleteNamedQuery",
"athena:GetNamedQuery",
"athena:*",
"athena:ListQueryExecutions",
"athena:ListNamedQueries",
"athena:CreateNamedQuery",
"athena:StopQueryExecution",
"athena:GetQueryExecution",
"athena:BatchGetNamedQuery",
"athena:BatchGetQueryExecution"
],
"Resource": "*"
},
{
"Sid": "VisualEditor3",
"Effect": "Allow",
"Action": [
"glue:GetTable",
"glue:GetTables",
"glue:GetDatabase"
],
"Resource": [
"arn:aws:glue:eu-west-3:<my-account-client-ID>:catalog",
"arn:aws:glue:eu-west-3:<my-account-client-ID>:database/*",
"arn:aws:glue:eu-west-3:<my-account-client-ID>:table/*/*"
]
}
答案 0 :(得分:1)
问题在于select语句:如果您未指定它,则将使用数据库 default ;如果您的环境中没有这样的数据库,它将失败。您应该指出您的数据库和表:
cursor.execute("SELECT * FROM <YOUR_DATABASE>.<YOUR_TABLE>")
或者您也可以在游标函数中使用参数指定数据库名称(或架构名称):
cursor = connect(aws_access_key_id='YOUR_ACCESS_KEY_ID',
aws_secret_access_key='YOUR_SECRET_ACCESS_KEY',
s3_staging_dir='s3://YOUR_S3_BUCKET/path/to/',
region_name='us-west-2').cursor(schema_name=<YOUR_DATABASE>)
cursor.execute("SELECT * FROM <YOUR_TABLE>")
如果执行其中一项操作,就不会再出现相同的错误。