编写联合查询 - Amazon Athena

编写联合查询

配置一个或多个数据连接器并将其部署到您的账户之后,您可以在 Athena 查询中进行使用。

查询单个数据源

本节中的示例假定您已配置 Amazon Athena CloudWatch 连接器 并将其部署到您的账户。使用其他连接器时,使用相同的方法进行查询。

创建使用 CloudWatch 连接器的 Athena 查询
  1. https://console.aws.amazon.com/athena/ 打开 Athena 控制台。

  2. 在 Athena 查询编辑器中,创建在 FROM 子句中使用以下语法的 SQL 查询。

    MyCloudwatchCatalog.database_name.table_name

示例

以下示例使用 Athena CloudWatch 连接器连接到 /var/ecommerce-engine/order-processor CloudWatch Logs 日志组中的 all_log_streams 视图。all_log_streams 视图是日志组中所有日志流的视图。示例查询将返回的行数限制为 100。

SELECT * FROM "MyCloudwatchCatalog"."/var/ecommerce-engine/order-processor".all_log_streams LIMIT 100;

以下示例解析与上一示例相同的视图中的信息。该示例提取顺序 ID 和日志级别,并筛选出所有 INFO 级别的消息。

SELECT log_stream as ec2_instance, Regexp_extract(message '.*orderId=(\d+) .*', 1) AS orderId, message AS order_processor_log, Regexp_extract(message, '(.*):.*', 1) AS log_level FROM MyCloudwatchCatalog."/var/ecommerce-engine/order-processor".all_log_streams WHERE Regexp_extract(message, '(.*):.*', 1) != 'INFO'

查询多个数据源

举一个更复杂的例子,假设一家电子商务公司使用以下数据来源存储与客户购买相关的数据:

假设该电子商务应用程序的数据分析师了解到,某些地区的送货时间受到当地天气状况的影响。分析师希望了解延迟送货的订单数量、受影响客户所在位置以及受影响最大的产品。分析师没有单独调查信息来源,而是使用 Athena 将数据联接到单个联合查询中。

SELECT t2.product_name AS product, t2.product_category AS category, t3.customer_region AS region, count(t1.order_id) AS impacted_orders FROM my_dynamodb.default.orders t1 JOIN my_mysql.products.catalog t2 ON t1.product_id = t2.product_id JOIN my_documentdb.default.customers t3 ON t1.customer_id = t3.customer_id WHERE t1.order_status = 'PENDING' AND t1.order_date between '2022-01-01' AND '2022-01-05' GROUP BY 1, 2, 3 ORDER BY 4 DESC

查询联合视图

查询联合源时,可以使用视图对底层数据来源进行模糊处理,或者隐藏来自查询数据的其他分析师的复杂联接。

注意事项和限制

  • 联合视图需要 Athena 引擎版本 3。

  • 联合视图存储在 AWS Glue 中,而不是底层数据来源中。

  • 使用联合目录创建的视图必须使用完全限定名称语法,如以下示例所示:

    "ddbcatalog"."default"."customers"
  • 在联合源上运行查询的用户必须有权查询联合源。

  • 联合视图需要 athena:GetDataCatalog 权限。有关更多信息,请参阅 允许 Athena 联合查询的 IAM 权限策略示例

示例

以下示例针对存储在联合数据来源中的数据创建了一个名为 customers 的视图。

CREATE VIEW customers AS SELECT * FROM my_federated_source.default.table

以下示例查询显示了一个引用 customers 视图而不是底层联合数据来源的查询。

SELECT id, SUM(order_amount) FROM customers GROUP by 1 ORDER by 2 DESC LIMIT 50

以下示例创建了一个名为 order_summary 的视图,该视图合并了来自联合数据来源和 Amazon S3 数据来源的数据。在已在 Athena 中创建的联合源中,视图使用 personprofile 表。在 Amazon S3 中,视图使用 purchasepayment 表。为了引用 Amazon S3,语句使用了关键字 awsdatacatalog。请注意,联合数据来源使用完全限定名称语法 federated_source_name.federated_source_database.federated_source_table

CREATE VIEW default.order_summary AS SELECT * FROM federated_source_name.federated_source_database."person" p JOIN federated_source_name.federated_source_database."profile" pr ON pr.id = p.id JOIN awsdatacatalog.default.purchase i ON p.id = i.id JOIN awsdatacatalog.default.payment pay ON pay.id = p.id

另请参阅