Data Aggregation dei file CSV java

1

Ho k csv files (5 file csv per esempio), ogni file ha m campi che producono una chiave e valori n . Ho bisogno di produrre un singolo file CSV con dati aggregati.

Sto cercando la soluzione più efficiente per questo problema, soprattutto la velocità. Non penso dal modo in cui avremo problemi di memoria. Inoltre vorrei sapere se l'hashing è davvero una buona soluzione perché dovremo usare una soluzione di hashing a 64 bit per ridurre le possibilità di una collisione a meno dell'1% (stiamo avendo circa 30000000 righe per aggregazione).

Ad esempio

file 1: f1,f2,f3,v1,v2,v3,v4
        a1,b1,c1,50,60,70,80
        a3,b2,c4,60,60,80,90 

file 2: f1,f2,f3,v1,v2,v3,v4
        a1,b1,c1,30,50,90,40
        a3,b2,c4,30,70,50,90

result: f1,f2,f3,v1,v2,v3,v4  
        a1,b1,c1,80,110,160,120
        a3,b2,c4,90,130,130,180

algoritmo che abbiamo pensato fino ad ora:

  1. hashing (usando concurentHashTable)

  2. unisci l'ordinamento dei file

  3. DB: usando mysql o hadoop o redis.

La soluzione deve essere in grado di gestire una grande quantità di dati (ogni file più di due milioni di righe)

un esempio migliore: file 1

country,city,peopleNum
england,london,1000000
england,coventry,500000

file 2:

country,city,peopleNum
england,london,500000
england,coventry,500000
england,manchester,500000

file unito:

country,city,peopleNum
england,london,1500000
england,coventry,1000000
england,manchester,500000

La chiave è: country,city . Questo è solo un esempio, la mia vera chiave è di dimensione 6 e le colonne di dati sono di dimensione 8 - totale di 14 colonne.

Vorremmo che la soluzione fosse la più veloce per quanto riguarda l'elaborazione dei dati.

    
posta royB 07.08.2013 - 16:04
fonte

2 risposte

1

Dal momento che i campi chiave sono sempre le prime colonne selezionerei le righe sorgente (senza l'intestazione) con i tasti e poi avanza in entrambi i file riga per riga simile a Merge_algorithm utilizzato in Mergesort .

Ma invece di ordinare i 2 csv-list in uno si calcola la somma di elementi che sono in entrambi gli elenchi. Gli elementi che sono in una lista solo sono semplicemente copiati.

L'algoritmo è simile a questo:

While (NOT EndOfFile(left-item) AND NOT EndOfFile(right-item))
  if (EndOfFile(right-item) OR left-item.key < right-item.key) store(left-item); advance left-item;
  if (EndOfFile(left-item) OR left-item.key > right-item.key) store(right-item); advance right-item;
  if (left-item.key = right-item.key) store(sum(right-item, left-item)); advance right-item; advance left-item
    
risposta data 07.08.2013 - 18:18
fonte
0

Vorrei utilizzare un database per archiviare i risultati (e gestire le transazioni) e quindi scrivere solo un piccolo script che legge un file e inserisce e / o aggiorna i dati di conseguenza (riga per riga). Puoi quindi eseguire lo script in parallelo su tutti i tuoi file di input e sborsare quanto può fare la tua macchina, o addirittura eseguirlo su più macchine.

Il database sarà il collo di bottiglia, però.

    
risposta data 23.08.2013 - 11:28
fonte

Leggi altre domande sui tag