설명
Protobuf 형식은 Protocol Buffers 형식입니다.
이 형식을 사용하려면 외부 포맷 스키마가 필요하며, 이 스키마는 쿼리 간에 캐시됩니다.
ClickHouse는 다음을 지원합니다:
proto2및proto3구문Repeated/optional/required필드
_(밑줄)와 .(점)은 동일한 것으로 간주됩니다.
컬럼과 Protocol Buffers’ 메시지의 필드 타입이 다르면 필요한 변환이 적용됩니다.
중첩된 메시지도 지원합니다. 예를 들어, 다음 메시지 타입의 필드 z는 다음과 같습니다:
x.y.z라는 이름의 컬럼(또는 x_y_z, X.y_Z 등)을 찾습니다.
중첩 메시지는 중첩 데이터 구조의 입력이나 출력에 적합합니다.
wire에서 누락된 매핑된 필드의 경우:
- 일반 널 비허용 매핑 컬럼은 파싱 중 protobuf 스키마 필드 기본값(
proto2의[default = …], 그 외에는 타입 기본값)을 사용하며, 테이블DEFAULT표현식은 사용하지 않습니다. - 매핑된
Nullable(...)컬럼은 필드가 없을 때NULL로 처리됩니다(protobuf 필드/타입 기본값을 사용하지 않습니다). google.protobuf.*Value래퍼에 대해input_format_protobuf_flatten_google_wrappers가 활성화된 경우:Nullable(...)컬럼에서 누락된 래퍼는 누락된 외부 필드로 처리되어NULL이 됩니다.- 존재하지만 비어 있는 래퍼(
str {})는 중첩 스칼라 기본값(''/0)을 유지합니다. - 누락된 래퍼에 매핑된 널 비허용 컬럼은
NULL대신 중첩 스칼라 기본값을 받습니다.
input_format_defaults_for_omitted_fields가 활성화된 경우(기본값), 메시지 타입에 일치하는 필드가 없는 테이블 컬럼에는 테이블 DEFAULT(및 기본 표현식)가 적용됩니다. 이 설정이 0이면 매핑되지 않은 컬럼은 테이블 DEFAULT 표현식 대신 파싱 중 삽입되는 데이터 타입 기본값을 유지합니다.
proto2 스키마 필드 기본값의 예시(메시지에서 누락된 매핑 필드에 사용됨):
input_format_protobuf_oneof_presence가 설정된 경우, ClickHouse는 oneof에서 발견된 필드를 나타내는 컬럼의 값을 채웁니다.
input_format_protobuf_oneof_presence은 기본적으로 비활성화되어 있습니다
ClickHouse는 protobuf 메시지를 length-delimited 길이 구분 형식으로 입력하고 출력합니다.
즉, 각 메시지 앞에 해당 메시지의 길이를 가변 길이 정수(varint)로 기록해야 합니다.
사용 예시
데이터 읽기 및 쓰기
예시 파일이 예시에서 사용하는 파일은 examples 리포지토리에서 확인할 수 있습니다.
protobuf_message.bin 파일의 데이터를 ClickHouse 테이블로 읽어옵니다. 그런 다음 Protobuf 형식을 사용해 이 데이터를
protobuf_message_from_clickhouse.bin이라는 파일로 다시 씁니다.
schemafile.proto 파일이 다음과 같다고 가정합니다:
바이너리 파일 생성
바이너리 파일 생성
이미 이제 이제 명령줄에서 스크립트를 실행하십시오. 예를 들어 다음 Python 라이브러리를 설치해야 합니다:바이너리 파일을 생성하려면 스크립트를 실행하십시오:
Protobuf 포맷으로 데이터를 직렬화하고 역직렬화하는 방법을 알고 있다면 이 단계는 건너뛰어도 됩니다.Python을 사용해 일부 데이터를 protobuf_message.bin에 직렬화한 뒤 ClickHouse로 읽어오겠습니다.
다른 언어를 사용하려면 “인기 있는 언어에서 길이 구분 Protobuf 메시지를 읽고 쓰는 방법”도 참고하십시오.다음 명령을 실행하여 schemafile.proto와
같은 디렉터리에 schemafile_pb2.py라는 Python 파일을 생성하십시오. 이 파일에는
UserData Protobuf 메시지를 나타내는 Python 클래스가 포함됩니다:schemafile_pb2.py와 같은
디렉터리에 generate_protobuf_data.py라는 새 Python 파일을 생성하십시오. 여기에 다음 코드를 붙여 넣으십시오:uv를 사용해
Python 가상 환경에서 실행하는 것을 권장합니다:Protobuf 형식을 사용하여 데이터를 바이너리 파일에 다시 쓸 수도 있습니다:
protobuf_message_from_clickhouse.bin에 기록된 데이터를 역직렬화할 수 있습니다.
ClickHouse Cloud에서 데이터 읽기 및 쓰기
format_protobuf_schema
설정을 사용해 쿼리에서 스키마를 지정할 수 있습니다. 이 예시에서는 로컬
머신에서 직렬화된 데이터를 읽어 ClickHouse Cloud의 테이블에 삽입하는 방법을 보여줍니다.
이전 예시와 마찬가지로, ClickHouse Cloud에서 Protobuf 스키마에 맞게 테이블을 생성합니다:
format_schema_source는 format_schema 설정의 소스를 정의합니다
가능한 값:
- ‘file’ (기본값): Cloud에서는 지원되지 않습니다
- ‘string’:
format_schema는 스키마(schema)의 리터럴 내용입니다. - ‘query’:
format_schema는 스키마(schema)를 가져오기 위한 쿼리입니다.
format_schema_source='string'
format_schema_source='query'
자동 생성된 스키마 사용
format_protobuf_use_autogenerated_schema 설정을 사용합니다.
예시:
structureToProtobufSchema를 사용해 테이블 구조에 따라 Protobuf 스키마를 자동으로 생성합니다. 그런 다음 이 스키마를 사용해 데이터를 형식으로 직렬화합니다.
자동 생성된 스키마를 사용해 Protobuf 파일도 읽을 수 있습니다. 이 경우 파일은 동일한 스키마를 사용해 생성되어 있어야 합니다:
format_protobuf_use_autogenerated_schema는 기본적으로 활성화되어 있으며, format_schema가 설정되지 않은 경우에 적용됩니다.
또한 설정 output_format_schema를 사용하면 입력/출력 시 자동 생성된 스키마를 파일에 저장할 수 있습니다. 예시:
path/to/schema/schema.capnp 파일에 저장됩니다.
Protobuf 캐시 삭제
format_schema_path에서 로드된 Protobuf 스키마를 다시 로드하려면 SYSTEM DROP ... FORMAT CACHE SQL 문을 사용하십시오.