【问题标题】:Join 2 tables results in query timeout加入 2 个表导致查询超时
【发布时间】:2021-10-27 16:37:54
【问题描述】:

我在 AWS Athena 中的“TestDB”下创建了一些表。这些表是通过 S3 存储桶运行 AWS Glue 爬网程序创建的。我正在尝试通过在“TestDB”下加入 2 个现有表来创建一个新表。这是一个简单的左外连接,如下所示:

CREATE TABLE IF NOT EXISTS TestTab1
AS (
  SELECT *
  FROM (
    (
      SELECT col1, col2, col3, col4
      FROM "TestDB"."tab1" a
      WHERE a.partition_0 = '10-24-2021'
        AND substring(a.datetimestamp, 1, 10) = '2021-10-24'
    )
    LEFT OUTER JOIN (
      SELECT  col1, col2, col3,col4
      FROM "TestDB"."tab2" b
      WHERE b.partition_0 = '10-24-2021'
        AND substring(b.datetimestamp,1,10) = '2021-10-24'
    )
    ON (a.col1 = b.col1)
  )
)

查询扫描了大约 5GB 的数据,但在大约 30 分钟后超时,因为这是超时限制。除了请求增加超时限制之外,还有其他方法可以在 AWS 上创建 2 个表的连接吗?

【问题讨论】:

标签: amazon-web-services aws-glue amazon-athena


【解决方案1】:

从您提供的信息很难说,但这可能是由于结果变得非常大或中间结果变得足够大,以至于执行程序耗尽内存并不得不溢出到磁盘。

只运行查询是否有效?您也可以尝试运行EXPLAIN SELECT … 来获取查询计划,看看是否能告诉您任何信息。


您的查询过于复杂,包含多个嵌套的 SELECT 语句。我认为 Athena 的查询规划器将足够聪明,可以将其重写为如下内容,更易于阅读和理解:

CREATE TABLE IF NOT EXISTS TestTab1 AS
SELECT col1, col2, col3, col4
FROM "TestDB"."tab1" a LEFT JOIN "TestDB"."tab2" b USING (col1)
WHERE a.partition_0 = '10-24-2021'
  AND b.partition_0 = '10-24-2021'
  AND substring(a.datetimestamp, 1, 10) = '2021-10-24' 
  AND substring(b.datetimestamp, 1, 10) = '2021-10-24'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 2023-01-13
    相关资源
    最近更新 更多