Approccio per eseguire un calcolo su un set di dati di grandi dimensioni e calcolare la media dei punteggi

3

Ho una tabella / collezione chiamata punteggi e ha 3 identificatori rilevanti in base ai quali il calcolo deve essere fatto.

campione

{
score : Number,
company : String, 
zone : String,
unit : String,
timestamp : Number
}

Ogni giorno riceviamo enormi quantità di dati in questa tabella dei punteggi che ha 3 identificatori. Sulla dashboard lato client, siamo tenuti a mostrare separatamente la progressione per azienda, zona e unità per le ultime sei settimane.

E le settimane non sono fisse, sono invece dinamiche. Ad esempio, se stai controllando la dashboard il 15 marzo, vengono mostrati i dati delle ultime 6 settimane dalla data x al 14 marzo. Progressione in termini di settimane.

Il piano è di creare un sistema che a mezzanotte prenderà i punteggi dai record degli ultimi 42 giorni da quel momento e calcolerà il punteggio settimanale e quindi lo salverà per ogni azienda, zona e unità separatamente.

Non so se questo approccio sia corretto o meno, probabilmente no. Diciamo che ci sono 500 record in arrivo nel sistema ogni giorno, quindi per 42 giorni avrò circa 21000 record. Ora il calcolo deve essere fatto separatamente per tutte e tre le entità.

Inoltre i record che sto andando a recuperare in base all'identificatore (uno da un set di tre) & timestamp, finirò con 42 giorni di dati. Come posso trasformarli in formato settimane? Dovrei recuperare i dati di 42 giorni in una volta sola e poi distribuirli tramite timestamp usando le condizioni o dovrei semplicemente chiamare per 1 settimana i dati in una volta sola.

Questo approccio sembra davvero fonte di confusione, dato che l'output che sto per ottenere non è così significativo. È questo l'approccio giusto per risolvere questo problema?

Voglio creare un sistema che verrà ridimensionato in futuro per più dati e non solo per 21k records.

    
posta Gandalf the White 15.03.2017 - 09:53
fonte

1 risposta

1

Everyday we get huge amount of data in this scores table which has 3 identifiers. On client side dashboard we are bound to show progression for company, zone and unit separately for past six weeks.

The plan is to create a system which at midnight will take scores from records for past 42 days from that time and calculate weekly score and then save it for every company, zone and unit separately.

Ecco un jsbin di una soluzione funzionante con dati di esempio :

link

Se disponi di un set di dati a tua disposizione, solo main(YOUR_DATA_HERE); assumendo che tutto segue l'esempio che hai fornito.

if you are checking the dashboard on 15th of march then past 6 weeks data from x date to 14th March is shown.

Prova:

var userEnteredStartTime = new Date('2017.05.15').getTime(); // 1489536000
const WEEK_IN_SECONDS = 604800;
var startTime = userEnteredStartTime;
var endTime = startTime + WEEK_IN_SECONDS;
var endTimeOfSixWeeks = (startTime + WEEK_IN_SECONDS) * 6;
var endTimeFortyTwoDaysLater = startTime + 3628800

I want to make a system that'll scale in future for more data and not just 21k records.

Come puoi vedere sopra, 38912 punti di dati impiegano 152.072 ms (~ 0.152s) Dovresti avere 275.000 record da elaborare prima che questa operazione si interrompa di 1 secondo.

    
risposta data 16.03.2017 - 21:11
fonte

Leggi altre domande sui tag