Przeszedłem przez dokumentację dla Clickhouse i nie widziałem opcji UPDATE ani DELETE. Wydaje mi się, że jest to system tylko do uzupełnienia. Czy istnieje możliwość aktualizacji istniejących rekordów lub czy istnieje jakieś obejście, takie jak obcięcie partycji, na której znajdują się rekordy, które uległy zmianie, a następnie ponowne wstawienie całych danych dla tej partycji?Aktualizowanie danych w Clickhouse
Odpowiedz
Można upuszczać i tworzyć nowe tabele, ale w zależności od ich rozmiaru może to być bardzo czasochłonne. Możesz zrobić coś takiego:
Do usunięcia coś takiego może zadziałać.
INSERT INTO tableTemp SELECT * from table1 WHERE rowID != @targetRowID;
DROP table1;
INSERT INTO table1 SELECT * from tableTemp;
Podobnie, aby zaktualizować wiersz, można go najpierw usunąć w ten sposób, a następnie go dodać.
ClickHouse nie obsługuje prawdziwej AKTUALIZACJI/USUŃ. ale istnieje kilka możliwych obejścia:
Próbuje zorganizować dane w taki sposób, że to nie musi być aktualizowana. Można zapisać rejestr zdarzeń aktualizacji w tabeli, a następnie obliczyć raporty z tego dziennika. Zamiast aktualizować istniejące rekordy, dodajesz nowe rekordy do tabeli.
Używanie mechanizmu tabeli, który przekształca dane w tle podczas scalania. Na przykład (raczej konkretny) silnik tabeli CollapsingMergeTree: https://clickhouse.yandex/reference_en.html#CollapsingMergeTree Istnieje również silnik tabeli ReplacingMergeTree (nie jest jeszcze udokumentowany, można znaleźć przykład w testach: https://github.com/yandex/ClickHouse/blob/master/dbms/tests/queries/0_stateless/00325_replacing_merge_tree.sql) Wadą jest to, że nie wiesz, kiedy zostanie wykonane scalanie tła i zrobi to kiedykolwiek.
Zobacz także odpowiedź samdoj.
Ale jak zaktualizować bardzo dużą tabelę. Na przykład, co jeśli mój proces polegał na zebraniu wielu rekordów, a następnie "poprawieniu" 15% z nich? – Jonathan
Zasadniczo wystarczy zaktualizować i usunąć wiele wierszy? Możesz najpierw wybrać te wiersze do tabeli tymczasowej i po prostu zmienić klauzulę where na "GDZIE nie znaleziono identyfikatora wiersza" (SELECT rowID FROM destinationTable "). Ograniczasz się tylko do tego, co możesz wybrać. – samdoj
Byłoby o wiele wydajniejszym zmienić nazwę tabeli zamiast wykonywania 'INSERT INTO table1 SELECT * from tableTemp;' –