구조화된 row key 쿼리
테이블에 구조화된 행 키를 정의하는 행 키 스키마가 있는 경우 SQL을 사용하여 행 키의 개별 세그먼트 또는 열을 쿼리할 수 있습니다.
전역 보조 색인을 포함한 연속 구체화된 뷰는 기본적으로 구조화된 행 키를 생성합니다. 테이블의 행 키 스키마를 만들어 SQL로 쿼리하려는 Bigtable 테이블의 구조화된 행 키를 정의할 수도 있습니다. 자세한 내용은 행 키 스키마 관리를 참고하세요.
키
구조화된 행 키 스키마가 없는 Bigtable 테이블에서 각 행은 단일 행 키로 색인이 생성됩니다. SQL로 테이블을 쿼리하면 행 키는 SQL에서 기본 키로 사용하는 _key
라는 열입니다. 의사 열이 아니므로 테이블에서 SELECT *
쿼리를 실행하면 _key
열의 값이 반환됩니다.
반면 행 키 스키마가 있는 테이블에서 행 키 (기본 키)는 행 키 스키마에서 필드로 이름이 지정된 모든 열의 조합입니다. 테이블에 행 키 스키마를 추가하면 _key
열이 유사 열이 됩니다. 즉, SELECT *
쿼리에는 표시되지 않지만 SELECT _key
문으로 명시적으로 선택할 수 있습니다.
샘플 쿼리
이 섹션의 예시에서는 sales
이라는 테이블에 다음 스키마가 있다고 가정합니다.
field {
field_name: "user_id"
type: { bytes_type { encoding { raw {} } } }
}
field {
field_name: "purchase_date"
type: { string_type { encoding { utf8_bytes {} } } }
}
field {
field_name: "order_number"
type: { string_type { encoding { utf8_bytes {} } } }
}
encoding {
delimited_bytes { delimiter "#" }
}
sales
테이블에는 다음 데이터가 포함됩니다. product
column family에는 두 개의 열이 있습니다.
행 키 | 제품 | |
---|---|---|
product_type | product_name | |
'user1#2025-05-20#abcd1233' | 'phone' | 'iPhone16_pro_max' |
'user1#2025-05-20#abcd1235' | '신발' | 'nike_hyperdunk' |
'user2#2025-05-24#defg456' | '헤드폰' | 'sony_wh_1000mx5' |
구조화된 행 키 쿼리 결과
sales
테이블에는 구조화된 행 키가 있으므로 SELECT *
문으로 테이블을 쿼리하면 쿼리에서 행 키의 각 세그먼트를 별도의 열로 반환합니다. Bigtable 테이블에 대한 모든 SQL 쿼리에서와 마찬가지로 column family의 열은 맵으로 표현됩니다.
SELECT * from sales
결과는 다음과 같이 표시됩니다.
user_id | purchase_date | order_number | 제품 |
---|---|---|---|
user1 | 2025-05-20 | 'abcd1233' | { product_type: "phone", product_name: "iPhone16_pro_max" } |
user1 | 2025-05-20 | 'abcd1235' | { product_type: "shoes", product_name: "nike_hyperdunk" } |
user2 | 2025-05-24 | 'defg456' | { product_type: "headphones", product_name: "sony_wh_1000mx5" } |
다음 예와 같이 쿼리에서 행 키 열을 지정할 수도 있습니다.
SELECT
product[product_type] AS product_type,
product[product_name] AS product_name
FROM sales
WHERE user_id = b"user1"
결과는 다음과 같이 표시됩니다.
product_type | product_name |
---|---|
'phone' | 'iphone16_pro_max' |
'신발' | 'nike_hyperdunk' |
필터
SQL 함수를 사용하여 행 키 스키마 열을 필터링할 수 있습니다. 다음 예에서는 CURRENT_DATE()
가 2025-05-24
를 반환한다고 가정합니다.
SELECT
user_id,
product["product_name"] AS product_name
FROM
sales
WHERE
PARSE_DATE("YYYY-MM-DD", purchase_date) = CURRENT_DATE()
AND user_id = b"user2"
결과는 다음과 같습니다.
user_id | product_name |
---|---|
user2 | 'sony_wh_1000mx5' |
집계 쿼리
다음 예는 구조화된 행 키 필드에서 집계 쿼리를 사용하는 방법을 보여줍니다.
SELECT
user_id,
product[product_type] AS product_type,
count(*) AS count
FROM sales
GROUP BY 1, 2
쿼리 결과는 다음과 같습니다.
user_id | product_type | 개수 |
---|---|---|
user1 | 전화 | 1 |
user1 | shoes | 1 |
user2 | 헤드폰 | 1 |
원본 행 키
구조화된 행 키가 있는 테이블에서 원래 행 키를 검색하려면 쿼리에서 _key
열을 지정합니다.
SELECT
_key, user_id
FROM sales
쿼리는 다음을 반환합니다.
_key | user_id |
---|---|
'user1#2025-05-20#abcd1233' | user1 |
'user1#2025-05-20#abcd1235' | user1 |
'user2#2025-05-24#defg456' | user2 |