在 Redshift 中查找分区内的非唯一值

问题描述 投票:0回答:1

我有一个 2B+ 行外部表,我正在使用 Redshift Spectrum 读取该表。有两个相关列 - key_col (BIGINT) 和partition_col (VARCHAR)。 partition_col 是一个分区列,大约有 50 个分区。

我需要查找 key_col 中是否有重复值,如果有,则标记它们所在的分区。如果存在,保证它们位于同一个分区中

目前,这正在通过

完成
SELECT
  COUNT(key_col) as occurences,
  partition_col
FROM my_table
GROUP BY 
  partition_col,
  key_col
HAVING
  occurences > 1;

但是,随着数据量的增加,这可能会非常慢。看看 EXPLAIN 计划,Redshift 似乎没有进行优化以利用 partition_col 是一个分区的事实,而只是对所有分区上的所有partition_col/key_col 对进行 HashAggregate。我认为(?)可以通过在每个分区内执行 HashAggregate 来完成,这将大大减少完成完整查询所需的比较次数。这可能正在完成,只是从解释计划中还不清楚,但无论如何我的问题是:

如何重写此查询以显式利用分区(或者不可能)?

我尝试了一些使用 LAG 和 ROW_NUMBER 窗口函数以及 PARTITION BY partition_col 的方法,但是虽然逻辑非常简单,但都需要按 key_col 排序,由于体积的原因,这也非常慢。

sql amazon-redshift bigdata
1个回答
0
投票

尝试在窗口函数中使用 redshift 的

PARTITION BY
子句:

WITH partition_duplicates AS (
  SELECT
    key_col,
    partition_col,
    COUNT(*) OVER (PARTITION BY partition_col, key_col) AS occurrences
  FROM my_table
)
SELECT
  key_col,
  partition_col
FROM partition_duplicates
WHERE occurrences > 1;
© www.soinside.com 2019 - 2024. All rights reserved.