Clickhouse의 설명서를 검토 한 결과 업데이트 또는 삭제 옵션이 표시되지 않았습니다. 그것은 저에게 append only system으로 보입니다. 기존 레코드를 업데이트 할 가능성이 있습니까 아니면 변경된 레코드가있는 파티션을 잘라내어 해당 파티션의 전체 데이터를 다시 채우는 것과 같은 몇 가지 해결 방법이 있습니까?Clickhouse에서 데이터 업데이트
8
A
답변
5
새 테이블을 삭제하고 만들 수 있지만 크기에 따라 시간이 많이 걸릴 수 있습니다. 다음과 같이 할 수 있습니다.
삭제시 이와 같은 작업이 가능합니다.
INSERT INTO tableTemp SELECT * from table1 WHERE rowID != @targetRowID;
DROP table1;
INSERT INTO table1 SELECT * from tableTemp;
마찬가지로, 행을 업데이트하려면 먼저이 방법으로 그것을 삭제할 수, 다음을 추가합니다.
9
ClickHouse는 실제 UPDATE/DELETE를 지원하지 않습니다. 그러나 거기에 몇 가지 가능한 해결 방법 :
이 방식으로 데이터를 구성하려고, 그 업데이트 할 필요가 없습니다 것입니다. 업데이트 이벤트 로그를 테이블에 기록한 다음 해당 로그에서 보고서를 계산할 수 있습니다. 따라서 기존 레코드를 업데이트하는 대신 새 레코드를 테이블에 추가합니다.
병합 중에 백그라운드에서 데이터 변환을 수행하는 테이블 엔진을 사용합니다. 예를 들어, (다소 구체적) CollapsingMergeTree 테이블 엔진 : https://clickhouse.yandex/reference_en.html#CollapsingMergeTree 또한 ReplacingMergeTree 테이블 엔진이 있습니다 (아직 문서화되지 않았습니다. 테스트에서 예제를 찾을 수 있습니다 : https://github.com/yandex/ClickHouse/blob/master/dbms/tests/queries/0_stateless/00325_replacing_merge_tree.sql) 단점은 사용자가 백그라운드 병합을 수행 할 때 모르는 것입니다 , 그리고 그것은 끝날 것입니다.
또한 samdoj의 대답을 살펴보십시오.
그러나 매우 큰 테이블은 어떻게 업데이트합니까? 예를 들어, 제 프로세스가 많은 레코드를 수집하고, 그 중 15 %를 "수정"한다면 어떻게 될까요? – Jonathan
기본적으로 여러 행을 업데이트 및 삭제 하시겠습니까? 먼저 임시 테이블에 해당 행을 선택하고 where 절을'WHERE rowID is not (SELECT rowID FROM targetTable')로 변경하면됩니다. 여기서는 선택할 수있는 항목으로 만 제한됩니다. – samdoj
tableTemp에서 INSERT INTO table1 SELECT *를 수행하는 대신 테이블의 이름을 바꾸는 것이 훨씬 더 효율적입니다. –