与 Redshift 本机表和外部表联合 (Spectrum)
Union with Redshift native tables and external tables (Spectrum)
如果我有一个包含本机 table 和外部 table 之间的联合的视图(伪代码):
create view vwPageViews as
select from PageViews
union all
select from PageViewsHistory
过去 2 年的页面浏览量。外部 table 有超过 2 年的旧数据。
- 如果用户在过去 6 个月内使用过滤器从视图中进行选择,RS Spectrum 如何处理它 - 它是否读取整个外部 table,即使 none 将被返回(并且因此,我们为此花了钱)? (假设 s3 文件是基于镶木地板的)。
例如
Select from vwPageViews where MyDate >= '01/01/2021'
使用 RS 和 Spectrum 查询冷数据和历史数据的最佳方法是什么?谢谢!
这将如何在 Spectrum 上发生将取决于您是否为 S3 中的数据提供了分区。如果没有分区(以及分区上的 where 子句),S3 中的 Spectrum 引擎将不得不读取每个文件以确定所需的数据是否在其中任何一个中。这样做的成本将取决于文件的数量和大小以及它们的格式。(例如,CSV 比 Parquet 更贵。)
解决这个问题的方法是对 S3 中的数据进行分区,并在分区值上有一个 WHERE 子句。当文件与分区值不匹配时,这将排除需要读取的文件。
困难在于为分区提供 WHERE 子句,因为这可能不如您在基础数据中使用的日期或时间戳那么精细。例如,如果您在 YearMonth (YYYYMM) 上进行分区并希望有一个日期级别的 WHERE 子句,您需要将 WHERE 子句分成两部分 - WHERE date_col >= 2015-07-12 AND part_col > = 201507。如何生成两个 WHERE 条件将取决于您围绕 Redshift 的解决方案。
如果我有一个包含本机 table 和外部 table 之间的联合的视图(伪代码):
create view vwPageViews as
select from PageViews
union all
select from PageViewsHistory
过去 2 年的页面浏览量。外部 table 有超过 2 年的旧数据。
- 如果用户在过去 6 个月内使用过滤器从视图中进行选择,RS Spectrum 如何处理它 - 它是否读取整个外部 table,即使 none 将被返回(并且因此,我们为此花了钱)? (假设 s3 文件是基于镶木地板的)。
例如
Select from vwPageViews where MyDate >= '01/01/2021'
使用 RS 和 Spectrum 查询冷数据和历史数据的最佳方法是什么?谢谢!
这将如何在 Spectrum 上发生将取决于您是否为 S3 中的数据提供了分区。如果没有分区(以及分区上的 where 子句),S3 中的 Spectrum 引擎将不得不读取每个文件以确定所需的数据是否在其中任何一个中。这样做的成本将取决于文件的数量和大小以及它们的格式。(例如,CSV 比 Parquet 更贵。)
解决这个问题的方法是对 S3 中的数据进行分区,并在分区值上有一个 WHERE 子句。当文件与分区值不匹配时,这将排除需要读取的文件。
困难在于为分区提供 WHERE 子句,因为这可能不如您在基础数据中使用的日期或时间戳那么精细。例如,如果您在 YearMonth (YYYYMM) 上进行分区并希望有一个日期级别的 WHERE 子句,您需要将 WHERE 子句分成两部分 - WHERE date_col >= 2015-07-12 AND part_col > = 201507。如何生成两个 WHERE 条件将取决于您围绕 Redshift 的解决方案。