GCP/Bigquery
[BigQuery] streaming buffer란?
운호(Noah)
2024. 7. 25. 16:02
에러 코드
BigQuery Table에서 특정 레코드를 DELETE하려했지만, 아래 에러가 발생했습니다.
UPDATE or DELETE statement over table '' would affect rows in the streaming buffer, which is not supported
에러 발생 원인
- BigQuery는 데이터를 테이블에 영구적으로 저장하기 전에 스트리밍 버퍼(streaming buffer)라는 메모리 기반 저장소에 임시로 저장합니다.
- 높은 데이터 수신 속도를 제공하기 위함입니다.
- 에러 메시지는
UPDATE
또는DELETE
문이 스트리밍 버퍼에 있는 행을 수정하려 했기 때문에 발생한 에러입니다. - 스트리밍 버퍼에 있는 데이터는 아직 테이블에 완전히 반영되지 않았기 때문에 이러한 행에 대해 직접적인 수정 작업은 불가능합니다.
- 최근에 삽입한 데이터가 아니라면 이미 테이블로 반영됐기 때문에, 수정이 가능하며 위 에러 또한 발생하지 않습니다.
- 스트리밍 버퍼에 있는 최신 데이터는 일정 시간(최대 약 90분) 이후에 테이블에 반영됩니다.
에러 해결 방법
스트리밍 버퍼에 있는 데이터를 삭제하거나 수정하려면 다음 방법을 사용할 수 있습니다.
기다리기
- 스트리밍 버퍼에 있는 데이터가 테이블에 반영될 때까지 기다립니다.
임시 테이블 사용
-- 임시 테이블로 원본 데이터 복사 CREATE OR REPLACE TABLE mydataset.temp_table AS SELECT * FROM mydataset.original_table; -- 임시 테이블에서 수정 작업 수행 UPDATE mydataset.temp_table SET column_name = 'new_value' WHERE condition; DELETE FROM mydataset.temp_table WHERE condition; -- 임시 테이블에서 원본 테이블로 데이터를 병합 MERGE mydataset.original_table AS T USING mydataset.temp_table AS S ON T.id = S.id WHEN MATCHED THEN -- temp_table의 값으로 업데이트 UPDATE SET column_name = S.column_name WHEN NOT MATCHED BY SOURCE THEN -- original_table에 있고 temp_table에는 없는 행은 삭제 DELETE;