在前面使用Redshift时,一般是使用Query Editor
连接到上面去执行SQL命令。而作为数据工程师或应用程序开发人员,对于某些用例,可能希望与Redshift以使用简单的API加载或查询数据,而无需管理持久连接。借助 Redshift Data API
,可以与 Redshift Serverless 交互,而无需配置 JDBC 或 ODBC,这使得使用 Redshift Serverless 变得更容易、更安全。
本节介绍如何通过AWS CLI将Data API
与 Redshift Serverless 结合使用。
Data API
让各种基于Web 服务的应用和基于事件驱动的服务无缝访问 Redshift Serverless 中的数据:
Data API
无需配置驱动程序和管理数据库连接,从而简化了对Redshift 的访问。相反,只需调用Data API 提供的API endpoint即可将 SQL 命令运行到 Redshift Serverless。Data API 负责管理数据库连接和缓冲数据。
Data API 是异步的,因此需要稍后检索结果。查询结果将保存 24 小时。
Data API
联合IAM,因此可以使用 Okta 或Active Directory
等身份提供商,而无需在 API 调用中传递数据库凭证。
Data API
不是 JDBC 和 ODBC 驱动程序的替代品,适用于不需要与Redshift建立持久连接的场景。它适用于以下场景:
Data API GitHub 提供了在Redshift Serverless 和预置集群的不同示例。
Data API 为 AWS CLI ( aws redshift-data
) 提供了命令行访问的方式,允许Redshift中的数据库进行交互。
查看help:
aws redshift-data help
下表显示了数据 API CLI 可用的不同命令。
命令 | 描述 |
---|---|
list-databases |
列出工作组中的数据库。 |
list-schemas |
列出数据库中的架构。您可以通过匹配的架构模式对此进行过滤。 |
list-tables |
列出数据库中的表。您可以按架构名称模式、匹配的表名称模式或两者的组合来过滤表列表。 |
describe-table |
描述有关表的详细信息,包括列元数据。 |
execute-statement |
运行 SQL 语句,可以是 SELECT、DML、DDL、COPY 或 UNLOAD。 |
batch-execute-statement |
作为单个事务的一部分批量运行多个 SQL 语句。这些语句可以是 SELECT、DML、DDL、COPY 或 UNLOAD。 |
cancel-statement |
取消正在运行的查询。要取消查询,查询不得处于 FINISHED 或 FAILED 状态。 |
describe-statement |
描述特定 SQL 语句运行的详细信息。这些信息包括查询开始时间、完成时间、处理的行数以及 SQL 语句。 |
list-statements |
列出最近24小时内的SQL语句。默认情况下,仅显示完成的语句。 |
get-statement-result |
获取临时缓存的查询结果。结果集包含完整的结果集和列元数据。您可以对一组记录进行分页,以根据需要检索整个结果。 |
aws redshift-data list-databases --workgroup-name workgroup-7bafae50ƒ
aws redshift-data list-schemas --database dev --workgroup-name workgroup-7bafae50
aws redshift-data execute-statement --database dev --workgroup-name workgroup-7bafae50 --sql "select count(*) from customer"
Data API 提供了一个简单的命令list-tables
来列出数据库中的表。schema中可能有数千个表;Data API 允许对结果集进行分页或通过提供过滤条件来过滤表列表, 例如搜索table-pattern
或者使用schema-pattern
.
以下是同时使用两者的代码示例:
aws redshift-data list-tables --database dev --workgroup-name default --schema-pattern "demo%" --table-pattern “orders%”
用Data API 运行Redshift 的 SELECT、DML、DDL、COPY
或 UNLOAD
命令。如果想在查询运行后将事件发送到 EventBridge,则可以选择指定–with-event
选项,然后Data API 将发送带有queryId
最终运行状态的事件。
查询数据:
检查语句的状态:
aws redshift-data describe-statement --id c6f58106-d8c3-4f7e-bbeb-7a623cd9f538
语句的状态可以是 STARTED、FINISHED、ABORTED
或 FAILED
。
取消正在运行的语句:
aws redshift-data cancel-statement --id 39a0de2f-e85e-45ff-a0d7-cd074c348120
从查询中获取结果,查询结果保存24小时:
aws redshift-data get-statement-result --id c6f58106-d8c3-4f7e-bbeb-7a623cd9f538
可以使用 Data API 在单个事务中为Redshift 运行多个 SELECT、DML、DDL、COPY
或 UNLOAD
命令。例如:
aws redshift-data batch-execute-statement --database dev --workgroup-name default \
--sqls "create temporary table mysales \
(firstname, lastname, total_quantity ) as \
SELECT firstname, lastname, total_quantity \
FROM (SELECT buyerid, sum(qtysold) total_quantity \
FROM sales \
GROUP BY buyerid \
ORDER BY total_quantity desc limit 10) Q, users \
WHERE Q.buyerid = userid \
ORDER BY Q.total_quantity desc;" "select * from mysales limit 100;"
describe-statement
会返回以下结果:
{
"CreatedAt": "2023-04-10T14:01:11.257000-07:00",
"Duration": 30564173,
"HasResultSet": true,
"Id": "23d99d7f-fd13-4686-92c8-e2c279715c21",
"RedshiftPid": 1073922185,
"RedshiftQueryId": 0,
"ResultRows": -1,
"ResultSize": -1,
"Status": "FINISHED",
"SubStatements": [
{
"CreatedAt": "2023-04-10T14:01:11.357000-07:00",
"Duration": 12779028,
"HasResultSet": false,
"Id": "23d99d7f-fd13-4686-92c8-e2c279715c21:1",
"QueryString": "create temporary table mysales (firstname, lastname,
total_quantity ) as \nSELECT firstname, lastname, total_quantity \nFROM (SELECT
buyerid, sum(qtysold) total_quantity\nFROM sales\nGROUP BY
buyerid\nORDER BY total_quantity desc limit 10) Q, users\nWHERE Q.buyerid =
userid\nORDER BY Q.total_quantity desc;",
"RedshiftQueryId": 0,
"ResultRows": 0,
"ResultSize": 0,
"Status": "FINISHED",
"UpdatedAt": "2023-04-10T14:01:11.807000-07:00"
},
{
"CreatedAt": "2023-04-10T14:01:11.357000-07:00",
"Duration": 17785145,
"HasResultSet": true,
"Id": "23d99d7f-fd13-4686-92c8-e2c279715c21:2",
"QueryString": ""select *\nfrom mysales limit 100;",
"RedshiftQueryId": 0,
"ResultRows": 40,
"ResultSize": 1276,
"Status": "FINISHED",
"UpdatedAt": "2023-04-10T14:01:11.911000-07:00"
}
],
"UpdatedAt": "2023-04-10T14:01:11.970000-07:00",
"WorkgroupName": "default"
}
在前面的示例中,我们有两个 SQL 语句,因此输出包括 SQL 语句的 ID23d99d7f-fd13-4686-92c8-e2c279715c21:1
和23d99d7f-fd13-4686-92c8-e2c279715c21:2
。批处理 SQL 语句的每个子语句都有一个状态,批处理语句的状态会更新为最后一个子语句的状态。例如,如果最后一条语句的状态为 FAILED,则批处理语句的状态将显示为 FAILED。
可以分别获取每个语句的查询结果。在我们的示例中,第一条语句是创建临时表的 SQL 语句,因此第一条语句没有可检索的结果。通过提供子语句的语句 ID 来检索第二条语句的结果集:
aws redshift-data get-statement-result --id 23d99d7f-fd13-4686-92c8-e2c279715c21:2