我想通过API在Athena中创建一个数据库。我在S3中有镶木地板文件,我想使用API查询,我想使用Athena进行查询。
无论如何,我可以通过API为Athena创建数据库吗?
答案 0 :(得分:11)
在Athena中创建数据库可以通过创建自己的API请求或使用SDK来完成。
以下是使用SDK的Python示例:
import boto3
client = boto3.client('athena')
config = {'OutputLocation': 's3://TEST_BUCKET/'}
client.start_query_execution(
QueryString = 'create database TEST_DATABASE',
ResultConfiguration = config
)
有适用于Java,.NET,Node,PHP,Python,Ruby,Go和C ++的SDK。如果您想创建自己的API请求,我建议您对signing process有一个很好的理解。您也可以使用AWS CLI:
$ aws athena start-query-execution --query-string "CREATE database ATHENA_TEST_TWO" --result-configuration "OutputLocation=s3://TEST_BUCKET/"
创建数据库后,您可以在查询请求中传递数据库名称。
context = {'Database': 'TEST_DATABASE'}
client.start_query_execution(QueryString='CREATE TABLE ...',
QueryExecutionContext = context,
ResultConfiguration=config)
要查看某些DDL从Parquet文件创建表,请参阅Amazon Athena User Guide上的以下示例。
编辑响应@ condo1234的问题:
但是如何将数据库与S3中的文件相关联?
简短的回答是你没有。您将表与在S3中的存储桶中共享前缀的文件相关联。
例如,假设我要创建一个表来分析s3://TEST_BUCKET
中保存的数据。通过AWS控制台,我可以使用命名不佳的“创建文件夹”按钮来创建名为one-table-many-files/
的前缀。然后我创建了两个csv文件:
f1.csv
Codd,1923
Ellison,1944
Chamberlin,1944
Boyce,1947
f2.csv
Hopper,1906
Floyd,1953
Moriarty Wolf Chambers,1980
然后我将这些文本文件上传到示例存储桶/前缀组合s3://TEST_BUCKET/one-table-many-files/
我运行了以下DDL:
CREATE EXTERNAL TABLE php_test.computer_scientists (
name string,
year_born int
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
LOCATION 's3://TEST_BUCKET/one-table-many-files/';
并运行以下SQL语句:
SELECT * FROM php_test.computer_scientists;
我得到了以下结果,其中来自DDL中指定的bucket +前缀组合中的两个文件的数据。
"name","year_born"
"Hopper","1906"
"Floyd","1953"
"Moriarty Wolf Chambers","1980"
"Codd","1923"
"Ellison","1944"
"Chamberlin","1944"
"Boyce","1947"
请注意,我使用的是“prefix”而不是“folder”?那是因为S3有no concept of a folder!但是,这些前缀很有用,因为它们允许Athena Partitioning。
根据您的要求,这里也是一个php示例。
<?php
print('Welcome to PHP');
require 'aws-autoloader.php';
$athena = new Aws\Athena\AthenaClient(['version' => 'latest', 'region' => 'us-east-1' ]);
$athena->StartQueryExecution([
'QueryString' => 'CREATE DATABASE php_test;',
'ResultConfiguration' => [
'OutputLocation' => 's3://TEST_BUCKET/', // REQUIRED
],
]);
?>
有关详情,请参阅PHP SDK Documentation。