亚马逊红移时间序列

时间:2017-09-11 08:17:12

标签: amazon-dynamodb amazon-redshift bigdata database nosql

为了简单起见,我可以说我有一个像arr[time]=[price,asset]一样的数组(价格可能会重复同一资产,最高可达每秒12次)。

我希望能够以不同的比例查看数据,例如5年,每1小时1个样本,2.5小时,每0.5小时1个样本,以及能够访问点之间的特定滴答。

在DynamoDB中使用多个表或在Redshift中使用单个数据库会更经济/方便吗?我使用哪些架构/表格进行Redshift?

编辑:我在{'time':1505128343,'price':3.141708,'asset':1}等时间段内搜索时看起来像WHERE time>=1504118343 AND time<=1505128343的实体我不一定要输出大范围的每一个价格(因此客户端不会崩溃)但是而是希望输出每个第n个价格。

在我的实现中,我会有不同比例的多个表,所以一旦范围足够大我们就会回退,所以如果我们有一系列表pricesprices30sprices1hprices1dayprices30s表将每30秒采样一次。

1 个答案:

答案 0 :(得分:1)

如果要严格访问每个第n条记录,可以使用窗口函数根据某种排序条件提供行号,但在性能方面可能非常糟糕。对于每60秒间隔的第一个价格,它会像这样工作:

WITH
sorted_entities as (
    select 
     time
    ,price
    ,asset
    ,row_number() over (partition by asset,time/60 order by time)
    from entities_table
)
select time, price, asset
from sorted_entities
where row_number=1

该查询将使用资产ID和Unix时间戳列的整数除法将表行分成小组,并根据精确时间给出每行1,2,3等,以便您可以进一步选择编号为1的行。你的表的排序键是asset,time它会更快地工作,因为具有相同asset的行在磁盘上彼此更接近。

如果抽样准确性不是优先考虑的话,你可以这么简单:

select * from entities_table where random()<0.0006944

其中0.0006944是1/24/60(一天被认为是100%概率,除以24小时和60分钟就得到一分钟的概率)。这将只是随机输出1/1440行并获取行数,随着时间的推移,您可能会获得半均匀分布的值集。

另一种方法是按照上面的建议计算平均值。