AWS Athena:名为boto3的查询未创建对应的表

我有以下boto3草稿脚本

#!/usr/bin/env python3
import boto3

client = boto3.client('athena')

BUCKETS='buckets.txt'
DATABASE='some_db'
QUERY_STR="""CREATE EXTERNAL TABLE IF NOT EXISTS some_db.{}(
         BucketOwner STRING,Bucket STRING,RequestDateTime STRING,RemoteIP STRING,Requester STRING,RequestID STRING,Operation STRING,Key STRING,Requesturi_operation STRING,Requesturi_key STRING,Requesturi_httpProtoversion STRING,HTTPstatus STRING,ErrorCode STRING,BytesSent BIGINT,ObjectSize BIGINT,TotalTime STRING,TurnAroundTime STRING,Referrer STRING,UserAgent STRING,VersionId STRING,HostId STRING,SigV STRING,CipherSuite STRING,AuthType STRING,EndPoint STRING,TLSVersion STRING
) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
         'serialization.format' = '1','input.regex' = '([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \\\"([^ ]*) ([^ ]*) (- |[^ ]*)\\\" (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\") ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$' )
LOCATION 's3://my-bucket/{}'"""

with open(BUCKETS,'r') as f:
    lines = f.readlines()


for line in lines:
    query_string = QUERY_STR.format(line,line)
    response = client.create_named_query(
        Name=line,Database=DATABASE,QueryString=QUERY_STR
    )
    print(response)

执行后,所有响应均返回状态代码200

为什么我看不到应该创建的对应表?

我应该(至少)不能看到那些存储在哪里的查询吗?

update1 :我现在正尝试通过上述查询实际创建表,如下所示:

for line in lines:
    query_string = QUERY_STR.format(DATABASE,line[:-1].replace('-','_'),line[:-1])
    try:
        response1 = client.start_query_execution(
            QueryString=query_string,WorkGroup=WORKGROUP,QueryExecutionContext={
                'Database': DATABASE
            },ResultConfiguration={
                'OutputLocation': OUTPUT_BUCKET,},)
        query_execution_id = response1['ResponseMetadata']['RequestId']
        print(query_execution_id)
    except Exception as e1:
        print(query_string)
        raise(e1)

再次,该脚本会输出一些查询ID(似乎没有错误),但是不会创建表。

我还遵循了@John Rotenstein的建议,并按如下方式初始化了我的boto3客户:

client = boto3.client('athena',region_name='us-east-1')
wangxd624565586 回答:AWS Athena:名为boto3的查询未创建对应的表

首先,response仅告诉您您的请求已成功提交。方法create_named_query()创建查询的摘要,然后可以在 Saved Queries 标签中的AWS Athena控制台中查看/访问该摘要。

enter image description here

在我看来,您想使用boto3创建表。在这种情况下,您需要使用start_query_execution()方法。

  

运行Query中包含的SQL查询语句。要求您有权访问运行查询的工作组。

start_query_execution中的响应200不能保证您的查询将成功执行。据我了解,此方法执行一些简单的预执行检查以验证查询的语法。但是,还有其他一些事情可能会在运行时使您查询失败。例如,如果您尝试在不存在的数据库中创建表,或者尝试在您无权访问的数据库中创建表定义。

这里是一个示例,当我使用查询字符串时,该字符串的格式为表的某些随机名称。

enter image description here

我得到了200的答复,并在response1['ResponseMetadata']['RequestId']中得到了一些价值。但是,由于我在AWS Glue目录中没有some_db,因此该查询在运行时失败,因此,没有创建表。

这是在boto3中跟踪查询执行的方式

import time

response1 = client.start_query_execution(
    QueryString=query_string,WorkGroup=WORKGROUP,QueryExecutionContext={
        'Database': DATABASE
    },ResultConfiguration={
        'OutputLocation': OUTPUT_BUCKET,},)
query_execution_id = response1['ResponseMetadata']['RequestId']

while True:
    time.sleep(1)
    response_2 = client.get_query_execution(
        QueryExecutionId=query_execution_id
    )
    query_status = response_2['QueryExecution']['Status']
    print(query_status)
    if query_status not in ["QUEUED","RUNNING","CANCELLED"]:
        break
,

为了重现您的情况,我做了以下事情:

  • 在Athena控制台中,我运行:
CREATE DATABASE foo
  • 在Athena控制台中,我在“数据库”下拉列表中选择了foo
  • 为简单起见,我运行了以下Python代码:
import boto3

athena_client = boto3.client('athena',region_name='ap-southeast-2') # Change as necessary

QUERY_STR="""
CREATE EXTERNAL TABLE IF NOT EXISTS foo.bar(id INT) 
LOCATION 's3://my-bucket/input-files/'
"""

response = athena_client.start_query_execution(
    QueryString=QUERY_STR,QueryExecutionContext={'Database': 'foo'},ResultConfiguration={'OutputLocation': 's3://my-bucket/athena-out/'}
)
  • 然后我进入Athena控制台,进行刷新,并确认创建了bar

建议:尝试以上操作以确认它也适用于您!

然后我使用您的代码的start_query_execution版本(显示在第二个代码块中)运行您的代码。我必须进行一些更改:

  • 我没有buckets.txt文件,所以我只提供了一个名字列表
  • 您的代码未显示OUTPUT_BUCKET的内容,因此我使用了s3://my-bucket/athena-output/(与您使用的格式匹配吗?)
  • 您的代码使用QUERY_STR.format(DATABASE...,但是{}中没有要插入数据库名称的QUERY_STR,因此我删除了DATABASE作为格式变量的输入
  • 我没有为WORKGROUP提供值

一切正常,创建了多个表。

因此,请检查以上要点,看是否对您造成了问题(例如,替换format()语句中的数据库名称)。

本文链接:https://www.f2er.com/3149810.html

大家都在问