Redshift时间序列表加载问题

时间:2016-10-05 15:25:17

标签: amazon-redshift

Redshift文档将时间序列表标识为最佳实践: http://docs.aws.amazon.com/redshift/latest/dg/c_best-practices-time-series-tables.html

但是,它没有解决以下任何问题:

  • union-all视图中有多少个表是合理的 - 数百个? (的未应答
  • 写入union-all视图并使用redshift将这些插入指向正确的基础表的任何方法? (答案:不)
  • 最有效的加载基础表的方法?也许使用firehose插入临时表,然后定期将这些行插入到union-all视图中的适当表中? (的未应答
  • 在查询union-all视图时,如果日期范围超出查询条件,则启用redshift以消除某些底层分区(表)的方法是什么? (答案:否)
  • 可以redshift支持删除旧表,添加新表并在事务中重建union-all视图吗? (的未应答

我的情况:

  • 每天增加1亿行,将在3年内增加到5亿行
  • 希望保留12个月
  • 估计所有查询的99%将在最近的1-7天内发布
  • 数据通过kinesis firehose写入现有表到s3,然后触发复制到redshift表。

我建议的解决方案:

  • 使用union all视图创建一年的每日表,以及sensor_id(100,000+ uniq值)的dist_key和(timestamp,sensor_id)的sort_key。
  • 将火灾加载到临时表中
  • 创建单独的流程,每小时一次查询登台表以发现表格中的数据日期,然后执行插入适当的表格' select * from timestamp = table' s时间戳。
  • 这个每小时编写器可能会在事务中包装一个表重命名,多个插入选择和表重新创建,以便对firehose不可见。
  • 每月删除一次旧表,创建下个月的表,然后重建视图。
  • 此联合所有视图维护可能包含在事务中,以避免对用户造成影响。
  • 夜间运行真空分析仪。

编辑:添加说明,确定已回答哪些问题,并在建议的解决方案中添加一些细节。

1 个答案:

答案 0 :(得分:2)

您建议的过程听起来相当不错!虽然我无法回答您的所有问题,但这里有一些信息:

任何写入union-all视图并使用redshift的方法都会将这些插入指向正确的基础表?

视图是只读的。不可能写入视图,也不可能在期望Redshift将其发送到适当的表(例如给定日期的特定表)时插入数据。

在查询union-all视图时,如果日期范围超出查询条件,是否可以启用redshift消除某些底层分区(表)?

Redshift不会从查询中排除特定的表,但通过区域映射来避免读取特定的磁盘块。写入磁盘的每个数据块都与特定的表和列相关联。该块具有区域图,它指示块中存储的该字段的最小值和最大值。

如果查询包含WHERE子句,Redshift可以跳过不包含相关数据的块。这在SORTKEY列上使用时特别有用,因为类似的数据范围组合在一起。

鉴于您使用的日期为SORTKEY,如果查询包含基于该列的WHERE子句,Redshift将读取极少数磁盘块。这与跳过表的想法非常相似,但它实际上是跳过读取磁盘块。