Avro 데이터 쿼리

Bigtable용 GoogleSQL을 사용하면 Bigtable 테이블에 저장된 직렬화된 Apache Avro 레코드에서 개별 필드를 쿼리, 필터링, 프로젝션할 수 있습니다. SQL 쿼리에서 Avro 스키마 번들을 참조하면 바이트 열을 구조화된 Avro 레코드로 변환하고 중첩된 필드를 추출할 수 있습니다.

Avro 필드를 쿼리하기 전에 Avro 스키마 만들기 및 관리에 설명된 대로 스키마 번들에 Avro 스키마를 업로드해야 합니다. GoogleSQL 쿼리가 Bigtable 테이블 스키마에 매핑되는 방식과 SQL 문에서 열을 참조하는 방법을 알아보려면 Bigtable용 GoogleSQL 개요를 참조하세요.

Java에서 GoogleSQL로 Avro 데이터를 쿼리하려면 Cloud Bigtable 클라이언트 라이브러리에서 executeQuery 메서드를 사용합니다. 클라이언트 라이브러리로 SQL 쿼리를 실행하는 예시는 클라이언트 라이브러리를 참조하세요.

Avro 데이터 유형 매핑

직렬화된 BYTES를 Avro 레코드로 변환하면 Bigtable용 GoogleSQL은 다음과 같이 Avro 스키마 유형을 SQL 액세스 가능 유형에 매핑합니다.

Avro 유형 GoogleSQL 표현 설명
int, long INT64 32비트 및 64비트 부호 있는 정수는 64비트 정수에 매핑됩니다.
float FLOAT32 단정밀도 부동 소수점 값
double FLOAT64 배정밀도 부동 소수점 값
boolean BOOL 불리언 값 (TRUE 또는 FALSE)
string STRING 유니코드 문자 시퀀스
bytes BYTES 원시 바이트 시퀀스
record 메시지 객체 점 표기법 (예: record.field)을 사용하여 중첩된 필드에 액세스합니다.
enum ENUM 열거된 기호 집합
array ARRAY 반복되는 입력란입니다. Bigtable은 중첩 배열을 지원하지 않습니다.
map<T> 반복되는 키-값 항목 Avro 맵에는 STRING 키가 있습니다. Bigtable은 {"type": "map", "values": ["null", "string"]}와 같이 null을 허용하는 값이 있는 맵을 지원합니다. ARRAY_TRANSFORM 함수를 사용하여 맵을 ARRAY<STRUCT<key STRING, value T>>로 변환할 수 있습니다.
union Null 허용 필드 Bigtable은 null과 null이 아닌 유형 하나를 포함하는 합집합을 표준 null 허용 필드에 매핑합니다.
fixed Bigtable은 fixed 유형을 지원하지 않습니다. 고정 길이 바이트 시퀀스입니다.

예시 데이터

이 페이지의 예시에서는 my_avro ID가 있는 Avro 스키마 번들을 사용합니다. 이 번들에는 com.example.billing 네임스페이스에 다음 Transaction 레코드 스키마가 포함되어 있습니다.

{
  "type": "record",
  "namespace": "com.example.billing",
  "name": "Transaction",
  "fields": [
    {"name": "product_name", "type": "string"},
    {"name": "product_category", "type": "string"},
    {"name": "configs", "type": {"type": "map", "values": "string"}}
  ]
}

table이라는 Bigtable 테이블은 직렬화된 Avro 레코드를 cf column family 및 product column qualifier(cf['product'])에 저장합니다.

row key cf['product'] 열(직렬화된 BYTES로 저장되며 가독성을 위해 JSON으로 표시됨)
row1 {"product_name": "Chips", "product_category": "yummy food", "configs": {"size": "large", "flavor": "BBQ"}}
row2 {"product_name": "Apple", "product_category": "yummy food", "configs": {}}
row3 {"product_name": "Book", "product_category": "reading", "configs": {"author": "Jane Doe"}}

쿼리 예

Avro 스키마 번들을 업로드한 후 Bigtable용 GoogleSQL에서 CAST 연산자를 사용하여 BYTES 값을 Avro 레코드로 해석할 수 있습니다.

열 변환 및 필드 프로젝션

BYTES 값을 Avro 레코드로 변환하려면 다음 형식으로 전체 레코드 이름을 지정합니다.

SCHEMA_BUNDLE_ID.FULLY_QUALIFIED_RECORD_NAME

다음을 바꿉니다.

  • SCHEMA_BUNDLE_ID: 스키마 번들의 ID
  • FULLY_QUALIFIED_RECORD_NAME: Avro 스키마에 정의된 네임스페이스를 포함한 Avro 레코드의 전체 이름입니다(예: com.example.billing.Transaction).

지정된 스키마 번들 또는 레코드 이름이 없으면 쿼리가 INVALID_ARGUMENT 상태 및 type not found 오류 메시지와 함께 실패합니다. 제공된 스키마가 셀 바이트를 파싱할 수 없으면 쿼리가 FAILED_PRECONDITION 또는 INVALID_ARGUMENT 상태로 실패합니다.

다음 쿼리는 cf['product'] 열을 my_avro 스키마 번들의 com.example.billing.Transaction 레코드로 변환하고 product_name 필드를 프로젝션합니다.

SELECT
  CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name
FROM
  table;

쿼리는 다음 결과를 반환합니다.

product_name(STRING)
칩
Apple
예약

Avro 필드를 기준으로 필터링

WHERE 절을 사용하여 Avro 레코드 내의 필드 값을 기준으로 행을 필터링할 수 있습니다.

다음 쿼리는 product_category 필드가 "yummy food"과 같은 행을 필터링합니다.

SELECT
  CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name
FROM
  table
WHERE
  CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_category = "yummy food";

쿼리는 다음 결과를 반환합니다.

product_name(STRING)
칩
Apple

지도 필드 액세스

ARRAY_TRANSFORM 함수를 사용하여 Avro map 필드의 키-값 쌍을 STRUCT 요소 배열로 프로젝션할 수 있습니다.

다음 쿼리는 product_name를 프로젝션하고 configs 맵 필드를 STRUCT<key STRING, value STRING> 요소 배열로 변환합니다.

SELECT
  CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name,
  ARRAY_TRANSFORM(
    CAST(cf['product'] AS my_avro.com.example.billing.Transaction).configs,
    e -> STRUCT(e.key, e.value)
  ) AS map_array
FROM
  table;

쿼리는 다음 결과를 반환합니다.

product_name(STRING) map_array(ARRAY<STRUCT<key STRING, value STRING>>)
칩 [{"key": "size", "value": "large"}, {"key": "flavor", "value": "BBQ"}]
Apple []
예약 [{"key": "author", "value": "Jane Doe"}]

뷰와 함께 사용

연속 구체화된 뷰 및 논리적 뷰에서 Avro 스키마 번들을 참조할 수 있습니다.

연속 구체화된 뷰 또는 논리적 뷰가 Avro 스키마 번들을 참조하는 경우 번들을 삭제할 수 없습니다. 번들을 삭제하기 전에 번들을 참조하는 연속 구체화된 뷰를 삭제해야 합니다. 번들을 참조하는 논리적 뷰의 경우 뷰를 업데이트하여 참조를 삭제하거나 뷰를 삭제해야 합니다.

다음 명령어는 product_name별로 트랜잭션 수를 집계하는 연속 구체화된 뷰를 만듭니다.

gcloud bigtable materialized-views create MATERIALIZED_VIEW_ID \
    --instance=INSTANCE_ID \
    --query="SELECT CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name AS product, COUNT(*) AS transaction_count FROM table GROUP BY product;"

다음을 바꿉니다.

  • MATERIALIZED_VIEW_ID: 스키마 번들을 참조하는 연속 구체화된 뷰의 ID
  • INSTANCE_ID: Bigtable 인스턴스의 ID

다음 단계