扫描了AWS Athena查询数据并花费了时间

时间:2019-07-01 09:28:54

标签: presto amazon-athena

我在Aws Athena QUERY1和QUERY2中运行了2条以下SQL查询。我只是选择了QUERY1中的所有内容,但在QUERY2中我做了一些转换,这些转换在QUERY2中有详细说明。

经过预处理的表包括三列,即column1,column2和id。 这三列都是字符串类型。 显示创建表的预处理结果:

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

1 个答案:

答案 0 :(得分:0)

雅典娜目前无法实现您的要求。如果我正确理解了您的问题,则希望计算column1column2的不同值的交叉联接。

Athena不会重用命名查询的结果,这意味着在您的查询中,对dataset_1dataset_2进行求值时,它们都将在dataset中运行该语句。

为避免两次读取源表,您将不得不在一个查询中计算column1column2的不同值。可以使用array_agg函数和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)

您必须测试它在大基数上的表现。