2017-09-11 5 views
0

Zur Vereinfachung sagen wir, ich habe ein Array wie folgt arr[time]=[price,asset] (Preise können für das gleiche Asset bis zu 12 mal pro Sekunde wiederholen).Amazon Redshift Zeitreihe

Ich möchte in der Lage sein, die Daten in verschiedenen Skalen anzuzeigen, z. 5 Jahre mit 1 Probe pro Stunde, 2,5 Jahre mit 1 Probe pro 0,5 Stunden sowie Zugang zu bestimmten Zecken zwischen den Punkten.

Wäre es wirtschaftlicher/bequemer, mehrere Tabellen in DynamoDB oder eine einzelne Datenbank in Redshift zu verwenden? Welches Schema/welche Tabellen verwende ich für Redshift?

EDIT: Ich habe Entitäten wie {'time':1505128343,'price':3.141708,'asset':1} suchen bei der Suche zwischen Zeiträumen wie WHERE time>=1504118343 AND time<=1505128343 Ich möchte nicht unbedingt jeden einzelnen Preis für große Bereiche ausgeben (so stürzt der Client nicht ab), sondern würde stattdessen jeden nth ausgeben Preis.

In meiner Implementierung würde ich mehrere Tabellen für die verschiedenen Skalen haben so einmal die Reichweite groß genug ist, dass wir Rückfall, also wenn, wenn wir eine Reihe von Tabellen prices haben, prices30s, prices1h, prices1day etc die prices30s Tabelle der Serie abgetastet hätte einmal pro 30 Sekunden.

+0

Sorry, aber Ihre Anforderungen sind nicht sehr klar, so dass es schwierig ist, Ihre Frage zu beantworten. Können Sie eine Stichprobe der in den Tabellen gespeicherten Daten und eine Beispielabfrage anzeigen, die Sie ausführen möchten? Was meinst du mit "Daten in verschiedenen Maßstäben anzeigen" und "auf spezifische Ticks zwischen Punkten zugreifen"? Und was bedeutet 'arr [Zeit] = [Preis, Vermögen] '? –

+0

Entschuldigung, wenn ich mich schlecht erklärt habe, habe ich den ursprünglichen Beitrag bearbeitet und ausgearbeitet. – Max0999

+0

Anstatt Daten nach dem Zufallsprinzip zu erfassen, wäre es nicht besser, einen durchschnittlichen Preis für einen bestimmten Zeitraum anzugeben, wie den durchschnittlichen (oder maximalen) Stundenpreis, den durchschnittlichen (oder maximalen) Jahrespreis usw.? Data Warehouses wie Amazon Redshift können mit dieser Art von Berechnung recht einfach umgehen. –

Antwort

1

Wenn Sie genau auf jeden n-ten Datensatz zugreifen möchten, können Sie eine Fensterfunktion verwenden, die die Zeilennummer gemäß einer Sortierbedingung bereitstellt, aber in Bezug auf die Leistung kann sie ziemlich schlecht sein. Es wäre für jeden 60 Sekunden-Intervall für den ersten Preis wie folgt: Die

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 

diese Abfrage wird Ihre Tabellenzeilen in kleine Gruppen aufteilen Asset-ID und Integer-Division von Timestamp-Spalte Unix verwenden und jede Zeile 1,2 geben, 3 usw. basierend auf der genauen Zeit, so dass Sie Zeilen mit der Nummer 1 weiter auswählen können. Wenn der Sortierschlüssel Ihrer Tabelle asset,time ist, würde es schneller arbeiten, da Zeilen mit demselben asset näher beieinander auf der Festplatte wären.

Wenn Genauigkeit der Abtastung nicht die Priorität ist, dass Sie tun können, es so einfach wie diese:

select * from entities_table where random()<0.0006944 

wo 0,0006944 ist 1/24/60 (ein Tag ist zu 100% Wahrscheinlichkeit betrachtet, und dividiert durch 24 Stunden und 60 Minuten erhalten Sie eine Wahrscheinlichkeit von einer Minute). Das würde nur 1/1440 Ihrer Zeilen nach dem Zufallsprinzip ausgeben und die Anzahl der Zeilen nehmen, Sie werden wahrscheinlich im Laufe der Zeit halbwegs verteilte Menge von Werten erhalten.

Eine andere Möglichkeit wäre, den Durchschnitt wie oben angegeben zu berechnen.

Verwandte Themen