Pyathena模式不存在

时间:2019-10-29 09:44:37

标签: amazon-web-services amazon-iam pyathena

我需要处理存储桶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/*/*"
        ]
    }

1 个答案:

答案 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>")

如果执行其中一项操作,就不会再出现相同的错误。