2017-09-11 6 views
0

Par simplicité, disons que j'ai un tableau comme suit arr[time]=[price,asset] (les prix peuvent se répéter pour le même actif jusqu'à 12 fois par seconde).Amazon Redshift Time Series

Je souhaiterais pouvoir afficher les données à différentes échelles, par ex. 5 ans avec 1 échantillon par 1 heure, 2,5 ans avec 1 échantillon par 0,5 heure ainsi que pouvoir accéder à des tiques spécifiques entre les points.

Serait-il plus économique et pratique d'utiliser plusieurs tables dans DynamoDB ou une seule base de données dans Redshift? Quels schémas/tables est-ce que j'utilise pour Redshift?

EDIT: J'ai des entités qui ressemblent {'time':1505128343,'price':3.141708,'asset':1} lors de la recherche entre les périodes de temps comme WHERE time>=1504118343 AND time<=1505128343 Je ne veux pas nécessairement sortir chaque prix pour de grandes plages (de sorte que le client ne plante pas) mais au lieu voudrait sortir chaque nth prix.

Dans ma mise en œuvre, je dispose de plusieurs tables pour différentes échelles donc une fois que la plage est assez grande, nous REPLI, donc si quand nous avons une série de tables prices, prices30s, prices1h, prices1day etc la table prices30s aurait la série échantillonnées une fois par 30 secondes.

+0

Désolé, mais vos exigences ne sont pas très claires, il est donc difficile de répondre à votre question. Pouvez-vous montrer un échantillon des données stockées dans les tables, et un exemple de requête que vous souhaitez exécuter? Qu'entendez-vous par "voir les données à différentes échelles" et "accéder à des ticks spécifiques entre les points"? Et qu'est-ce que 'arr [temps] = [prix, actif]' veut dire? –

+0

Désolé si je me suis mal expliqué, j'ai édité et élaboré le message original. – Max0999

+0

Plutôt que d'échantillonner au hasard des données, ne serait-il pas préférable de fournir un prix moyen pour une période donnée, comme le prix horaire moyen (ou max), le prix annuel moyen (ou max), etc.? Les entrepôts de données tels qu'Amazon Redshift peuvent gérer ce type de calcul assez facilement. –

Répondre

1

Si vous souhaitez accéder strictement à chaque enregistrement nième, vous pouvez utiliser une fonction de fenêtre qui fournit le numéro de ligne en fonction de certaines conditions de tri, mais cela peut être assez mauvais en termes de performances. Il fonctionnerait comme cela pour le premier prix pour chaque intervalle de 60 sec:

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 

cette requête brisera vos lignes de table en petits groupes en utilisant ID d'actifs et la division entière de la colonne d'horodatage Unix et de donner toutes les lignes 1,2, Si la table de tri de votre table est asset,time, cela fonctionnerait plus rapidement car les lignes asset seraient plus proches les unes des autres sur le disque.

Si la précision de l'échantillonnage n'est pas la priorité que vous pouvez le faire aussi facile que cela:

select * from entities_table where random()<0.0006944 

où 0,0006944 est 24/01/60 (un jour est considéré comme 100% de probabilité, et en divisant par 24 heures et 60 minutes vous obtenez une probabilité d'une minute). Cela produirait juste 1/1440ème de vos rangées au hasard et en prenant le nombre de rangées, vous aurez probablement un ensemble de valeurs réparties semi-uniformément au fil du temps.

Une autre façon serait juste de calculer la moyenne comme indiqué ci-dessus.