我在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
答案 0 :(得分:0)
雅典娜目前无法实现您的要求。如果我正确理解了您的问题,则希望计算column1
和column2
的不同值的交叉联接。
Athena不会重用命名查询的结果,这意味着在您的查询中,对dataset_1
和dataset_2
进行求值时,它们都将在dataset
中运行该语句。
为避免两次读取源表,您将不得不在一个查询中计算column1
和column2
的不同值。可以使用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)
您必须测试它在大基数上的表现。