2016-06-18 19 views
8

Ho esaminato la documentazione di Clickhouse e non ho visto l'opzione AGGIORNAMENTO né ELIMINA. Mi sembra un sistema solo append. Esiste la possibilità di aggiornare i record esistenti o c'è qualche soluzione alternativa come il troncamento di una partizione con i record che sono stati modificati e quindi reinserire l'intero dato per quella partizione?Aggiornamento dei dati in Clickhouse

risposta

5

È possibile rilasciare e creare nuove tabelle, ma a seconda delle dimensioni questo potrebbe richiedere molto tempo. Si potrebbe fare qualcosa del genere:

Per la cancellazione, qualcosa del genere potrebbe funzionare.

INSERT INTO tableTemp SELECT * from table1 WHERE rowID != @targetRowID; 
    DROP table1; 
    INSERT INTO table1 SELECT * from tableTemp; 

Analogamente, per aggiornare una riga, è possibile prima eliminarla in questo modo e quindi aggiungerla.

+0

Ma come aggiornare una tabella molto grande. Per esempio, cosa succede se il mio processo è stato quello di raccogliere molti record, quindi "correggere" il 15% di essi? – Jonathan

+1

Fondamentalmente basta aggiornare ed eliminare più righe? È possibile innanzitutto selezionare tali righe in una tabella temporanea e modificare semplicemente la clausola where come 'WHERE rowID non è in (SELECT rowID FROM targetTable') Qui si limita a ciò che è possibile selezionare. – samdoj

+1

Sarebbe molto più efficiente rinominare la tabella invece di fare 'INSERT INTO table1 SELECT * da tableTemp;' –

9

ClickHouse non supporta l'effettivo AGGIORNAMENTO/ELIMINAZIONE. ma ci sono alcune soluzioni possibili:

  1. Cercando di organizzare i dati in un modo, cioè non ha bisogno di essere aggiornato. È possibile scrivere il registro degli eventi di aggiornamento in una tabella e quindi calcolare i report da tale registro. Quindi, invece di aggiornare i record esistenti, aggiungi nuovi record a una tabella.

  2. Utilizzo del motore di tabella che esegue la trasformazione dei dati in background durante le unioni. Ad esempio, (piuttosto specifico) motore di tabella CollapsingMergeTree: https://clickhouse.yandex/reference_en.html#CollapsingMergeTree Inoltre, esiste un motore di tabella ReplacingMergeTree (non ancora documentato, è possibile trovare un esempio nei test: https://github.com/yandex/ClickHouse/blob/master/dbms/tests/queries/0_stateless/00325_replacing_merge_tree.sql) Lo svantaggio è che non si sa, quando sarà eseguita l'unione di sfondo e sarà mai fatto.

Guarda anche la risposta di samdoj.

Problemi correlati