首页 > 解决方案 > 扫描的 AWS Athena 查询数据和所用时间

问题描述

我在 Aws Athena QUERY1 和 QUERY2 中运行了 2 个 SQL 查询。我刚刚选择了 QUERY1 中的所有内容,但在 QUERY2 中我做了一些转换,这些转换在 QUERY2 中详细给出。

预处理的表由三列组成,即 column1、column2 和 id。这三列都是字符串类型。SHOW CREATE TABLE 预处理结果:

CREATE EXTERNAL TABLE `preprocessed`(
`column1` string COMMENT '',
`column2` string COMMENT '',
`id` string COMMENT '')
ROW FORMAT SERDE 
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUT FORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
's3://mybucket/myobject'
TBLPROPERTIES (
'has_encrypted_data'='false')

QUERY1 中扫描的数据 = 13 MB QUERY1 中所用时间 = 12 秒

QUERY2 中扫描的数据 = 27MB QUERY2 中所用时间 = 18 秒

QUERY2 中扫描的数据是 QUERY2 中的两倍。我认为这是因为我在 QUERY2 中扫描数据集两次。我希望将我的扫描数据改进为 QUERY2 的大约 13MB

QUERY1 :
WITH dataset AS
(
SELECT column1, column2, COUNT(DISTINCT id) AS value FROM preprocessed
)
SELECT * FROM dataset

QUERY2 :
WITH dataset AS
(
SELECT column1, column2, COUNT(DISTINCT id) AS value FROM preprocessed
),
dataset_1 AS
(
SELECT DISTINCT column1 FROM dataset
),
dataset_2 AS
(
SELECT DISTINCT column2 FROM dataset
),
dataset_3 AS
(
SELECT column1, column2 FROM dataset_1, dataset_2
)
SELECT * FROM dataset_3

标签: prestoamazon-athena

解决方案


Athena 目前无法实现您的要求。如果我正确理解您的问题,您想计算 和 的不同值的交叉column1连接column2

Athena 不会重用命名查询的结果,这意味着在您的查询中 whendataset_1dataset_2被评估时,它们都将在dataset.

为避免两次读取源表,您必须在一次查询中计算column1和的不同值。column2这可以通过array_agg函数 and来完成UNNEST

SELECT
  column1,
  column2
FROM (
  SELECT
    array_agg(DISTINCT column1) AS column1_values,
    array_agg(DISTINCT column2) AS column2_values
  FROM preprocessed
)
CROSS JOIN UNNEST (column1_values) c1 (column1)
CROSS JOIN UNNEST (column2_values) c2 (column2)

您必须测试它对大基数的表现如何。


推荐阅读