来自Python的Athena InvalidRequestException

时间:2018-11-08 15:55:03

标签: python amazon-web-services boto3 amazon-athena botocore

我正在尝试从S3存储桶读取CSV文件,并通过Python在雅典娜中创建表。但是我正在执行它-


开始数据库查询

{'QueryExecutionId':'9cc82243-4220-47d0-8b63-0aa4f01fd590','ResponseMetadata':{'RequestId':'1c74bec6-663a-42ef-b9d1-73c7372eb4e1','HTTPStatusCode':200,'HTTPHeaders' :{'content-type':'application / x-amz-json-1.1','date':'Thu,08 Nov 2018 15:37:11 GMT','x-amzn-requestid':'1c74bec6-663a -42ef-b9d1-73c7372eb4e1','content-length':'59','connection':'keep-alive'},'RetryAttempts':0}}}

开始创建表

回溯(最近通话最近):

文件“ C:/Users/Doc/PycharmProjects/aws-athena-repo/athena/app.py”,第61行,在     QueryExecutionContext = {'数据库':'athenadb'})

_api_call中的第320行的文件“ C:\ Program Files \ Python37 \ lib \ site-packages \ botocore \ client.py”     返回self._make_api_call(operation_name,kwargs)

_make_api_call中的文件“ C:\ Program Files \ Python37 \ lib \ site-packages \ botocore \ client.py”,行623     引发error_class(parsed_response,operation_name)

botocore.errorfactory.InvalidRequestException:调用StartQueryExecution操作时发生错误(InvalidRequestException):第1:8行:输入'CREATE EXTERNAL'处没有可行的选择


这是我的代码示例-

print("Start of DB Query")
# Create a new database
db_query = 'CREATE DATABASE IF NOT EXISTS athenadb;'
response = client.start_query_execution(
    QueryString=db_query,
    ResultConfiguration={'OutputLocation': 's3://mybucket'})
print(response)

table_query = '''
CREATE EXTERNAL TABLE IF NOT EXISTS `athenadb.testtable`(
    `id` int,
    `ident` string,
    `type` string,
    `name` string,
    `latitude_deg` double,
    `longitude_deg` double,
    `continent` string,
    `iso_country` string,
    `iso_region` string,
    `municipality` string,
    `scheduled_service` string,
    `gps_code` string,
    `iata_code` string,
    `local_code` string,
    `home_link` string,
    `wikipedia_link` string,
    `keywords` string 
)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ',' 
  LINES TERMINATED BY '\n' 
WITH SERDEPROPERTIES ( 
  'escape.delim'='\\')
STORED AS TEXTFILE
LOCATION 's3://mybucket/folder/' ;'''

print("Start of table creation")

response1 = client.start_query_execution(
    QueryString=table_query,
    ResultConfiguration={'OutputLocation': 's3://mybucket'},
    QueryExecutionContext={'Database': 'athenadb'})
print(response1)

我不确定问题是否与ROW FORMAT DELIMITED有关。 我认为我的代码很好。

详细步骤将不胜感激!

感谢adavace!

1 个答案:

答案 0 :(得分:0)

我将所有字段都用作String,将SERDEPROPERTIES用作OpenCSVSerde