我想通过 API 在 Athena 中创建一个数据库。我在 S3 中有镶木地板文件,我想使用 API 进行查询,并且我想使用 Athena 进行查询。
我可以通过 API 为 Athena 创建数据库吗?
可以通过创建您自己的 API 请求或使用 SDK 来在 Athena 中创建数据库。
这是一个使用 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 请求,我建议您充分了解签名流程。您还可以这样使用 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)
要了解一些从 Parquet 文件创建表的 DDL,请参阅 Amazon Athena 用户指南中的以下示例。
编辑回应@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 中指定的前缀组合。
"name","year_born"
"Hopper","1906"
"Floyd","1953"
"Moriarty Wolf Chambers","1980"
"Codd","1923"
"Ellison","1944"
"Chamberlin","1944"
"Boyce","1947"
请注意我使用的是“前缀”而不是“文件夹”一词?那是因为 S3 没有文件夹的概念!然而,这些前缀很有用,因为它们允许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 文档了解更多信息。
Java 和 AWS SDK 示例怎么样? 关于如何创建数据库的信息并没有反映在AWS上的文档和示例中,但是科学的戳方法确实创造了奇迹。 在 AWS 上使用此 https://docs.aws.amazon.com/athena/latest/ug/code-samples.html 示例,只需更改此
QueryExecutionContext queryExecutionContext =
QueryExecutionContext.builder().catalog("YourAWSCatalogName").build()
其中 YourAWSCatalogName 是 AWS 上的 Athena 控制台中的 Data Source 的名称。
接下来,使用带 DDL 的查询来创建数据库。
对我来说,这是一个谜,为什么不可能在同一个 Athena AWS 示例中写下这一点。