【问题标题】:AWS Athena query data scanned and time taken扫描的 AWS Athena 查询数据和所用时间
【发布时间】:2019-11-11 23:05:19
【问题描述】:

我在 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

【问题讨论】:

  • 这个问题还不是很清楚,在这里发布完整的查询、表结构、示例数据和预期结果会有很大帮助..
  • "在 QUERY2 中扫描的数据是 QUERY2 中的两倍。我认为这是因为我在 QUERY2 中扫描数据集两次。我希望我的扫描数据提高到 QUERY2 的大约 13MB " 我建议也运行EXPLAIN query 并在此处发布结果。
  • edit提供信息的问题,不要只是评论它..
  • 我也给出了完整的查询和表结构。但是我不知道如何在 Athena 中获取查询计划。
  • “表结构也” 我没看到? SHOW CREATE TABLE preprocessed 我们需要知道数据类型和索引,因为这是一个性能问题? “但是我不知道如何获取查询计划” EXPLAIN query 应该可以工作。

标签: presto amazon-athena


【解决方案1】:

Athena 目前无法实现您的要求。如果我正确理解您的问题,您想计算 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)

您必须测试它对大基数的性能。

【讨论】:

  • 是的,您的查询给出了正确的结果。但它与我的查询进行相同的扫描。我认为是因为它只扫描所需的列,并且没有进行两次扫描。它首先扫描 column1,然后是 column2。
  • 当您说“作为我的查询”时,您是指您的第一个查询还是第二个查询?哪个查询正在执行“相同的扫描”?你是说我的建议是你所追求的,还是它扫描了太多数据?
  • 实际上,如果在大型数据集上开始出现复杂查询,建议切换到 Redshift,因为它优于 Athena。
猜你喜欢
  • 2020-02-04
  • 2021-12-23
  • 2020-11-30
  • 1970-01-01
  • 2018-01-10
  • 2019-10-16
  • 2019-03-14
  • 2022-11-21
  • 1970-01-01
相关资源
最近更新 更多