2014-11-13 12 views
17

Mi piacerebbe essere in grado di fare una query di intervallo veloce su un tavolo da Parquet. La quantità di dati da restituire è molto piccola rispetto alla dimensione totale, ma poiché deve essere eseguita una scansione completa della colonna è troppo lenta per il mio caso d'uso.Index in Parquet

L'utilizzo di un indice risolverebbe questo problema e ho letto che questo doveva essere aggiunto in Parquet 2.0. Tuttavia, non riesco a trovare altre informazioni su questo quindi immagino che non lo sia. Non penso che ci sarebbero ostacoli fondamentali che impediscono l'aggiunta di indici (multi-colonna), se i dati sono stati ordinati, che nel mio caso lo è.

La mia domanda è: quando verranno aggiunti gli indici a Parquet e quale sarebbe il design di alto livello per farlo? Penso che sarei già soddisfatto di un indice che indichi la partizione corretta.

Cordiali saluti,

Sjoerd.

+0

Un tempo lunghissimo. È previsto per [v2.0] (https://github.com/Parquet/parquet-mr). – user568109

+0

forse interessante per te: https://github.com/lightcopy/parquet-index –

risposta

15

Parquet attualmente mantiene statistiche min/max per ogni pagina di dati. Una pagina di dati è un gruppo di ~ 1 MB di valori (dopo la codifica) per una singola colonna; più pagine sono quelle che compongono Parquet's column chunks.

Questi valori min/max vengono utilizzati per filtrare sia i blocchi di colonna che le pagine che costituiscono un blocco. Quindi dovresti essere in grado di migliorare il tempo di interrogazione ordinando i record in base alle colonne su cui vuoi filtrare, quindi scrivendo i dati in Parquet. In questo modo, ottieni il massimo dal filtro delle statistiche.

È inoltre possibile ottenere un filtraggio più granulare con questa tecnica diminuendo le dimensioni della pagina e del gruppo di righe, anche se scambierete efficienza di codifica e efficienza I/O.

+0

+1 Ottima risposta. Domanda però. "È inoltre possibile ottenere un filtraggio più granulare con questa tecnica riducendo la dimensione della pagina e del gruppo di righe" - Stai facendo riferimento a mapred.max.split.size o qualcos'altro? – Tagar

+1

Mi riferisco a due impostazioni Parquet: 'parquet.block.size' (la dimensione del gruppo di righe di destinazione in byte, il valore predefinito di 128 MB) e' parquet.page.size' (la dimensione della pagina di destinazione in byte prima della compressione ma dopo la codifica, predefinito 1 MB). – blue

+0

Interessante. Grazie. Questo non sarà veloce come usare Cassandra, che è quello che faccio ora, ma dovrebbe essere un grande miglioramento. Lo proverò quando ci arrivo. –