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;