从 Redshift Spectrum 获取 "Disk Full" 错误
Getting a "Disk Full" error from Redshift Spectrum
我在 Redshift Spectrum 上面临频繁 Disk Full error
的问题,因此,我不得不反复扩展集群。好像缓存会被删除
理想情况下,我希望扩大规模以保持缓存,并找到一种方法来了解查询中需要多少磁盘 space。
是否有任何文档讨论 Redshift Spectrum 的缓存,或者他们使用与 Redshift 相同的机制?
编辑:应 Jon Scott 的要求,我正在更新我的问题
SELECT p.postcode,
SUM(p.like_count),
COUNT(l.id)
FROM post AS p
INNER JOIN likes AS l
ON l.postcode = p.postcode
GROUP BY 1;
S3 上的压缩数据总量约为 1.8 TB。 Athena 花了 10 分钟,扫描了 700 GB 并告诉我 Query exhausted resources at this scale factor
编辑 2:我使用了 16 TB SSD 集群。
您没有提到您正在使用的 Redshift 集群的大小,但简单的答案是使用更大的 Redshift 集群(更多节点)或使用更大的节点类型(每个节点更多磁盘)。
出现此问题是因为 Redshift Spectrum 无法将完整的连接执行下推到 Spectrum 层。大部分数据返回到 Redshift 集群只是为了执行连接。
您还可以重组查询,以便可以将更多工作下推到 Spectrum,在这种情况下,通过在加入之前进行分组和计数。如果从每个子查询输出的总行数明显少于为连接返回的行数,这将是最有效的。
SELECT p.postcode
, p.like_count
, l.like_ids
FROM (--Summarize post data
SELECT p.postcode
, SUM(p.like_count)
FROM post AS p
GROUP BY 1
) AS p
INNER JOIN (--Summarize likes data
SELECT l.postcode
, COUNT(l.id) like_ids
FROM likes AS l
GROUP BY 1
) AS l
-- Join pre-summarized data only
ON l.postcode = p.postcode
;
我在 Redshift Spectrum 上面临频繁 Disk Full error
的问题,因此,我不得不反复扩展集群。好像缓存会被删除
理想情况下,我希望扩大规模以保持缓存,并找到一种方法来了解查询中需要多少磁盘 space。
是否有任何文档讨论 Redshift Spectrum 的缓存,或者他们使用与 Redshift 相同的机制?
编辑:应 Jon Scott 的要求,我正在更新我的问题
SELECT p.postcode,
SUM(p.like_count),
COUNT(l.id)
FROM post AS p
INNER JOIN likes AS l
ON l.postcode = p.postcode
GROUP BY 1;
S3 上的压缩数据总量约为 1.8 TB。 Athena 花了 10 分钟,扫描了 700 GB 并告诉我 Query exhausted resources at this scale factor
编辑 2:我使用了 16 TB SSD 集群。
您没有提到您正在使用的 Redshift 集群的大小,但简单的答案是使用更大的 Redshift 集群(更多节点)或使用更大的节点类型(每个节点更多磁盘)。
出现此问题是因为 Redshift Spectrum 无法将完整的连接执行下推到 Spectrum 层。大部分数据返回到 Redshift 集群只是为了执行连接。
您还可以重组查询,以便可以将更多工作下推到 Spectrum,在这种情况下,通过在加入之前进行分组和计数。如果从每个子查询输出的总行数明显少于为连接返回的行数,这将是最有效的。
SELECT p.postcode
, p.like_count
, l.like_ids
FROM (--Summarize post data
SELECT p.postcode
, SUM(p.like_count)
FROM post AS p
GROUP BY 1
) AS p
INNER JOIN (--Summarize likes data
SELECT l.postcode
, COUNT(l.id) like_ids
FROM likes AS l
GROUP BY 1
) AS l
-- Join pre-summarized data only
ON l.postcode = p.postcode
;