중첩 및 반복 열 지정

BigQuery는 데이터가 비정규화되었을 때 성능이 가장 뛰어납니다. 별표 또는 눈송이 스키마와 같은 관계형 스키마를 보존하는 대신, 데이터를 비정규화하고 중첩 및 반복 열을 활용하세요. 중첩 및 반복 열은 관계형(정규화) 스키마 유지로 인한 성능 영향 없이도 관계를 유지할 수 있습니다.

중첩 또는 중첩 및 반복 데이터는 UI 또는 JSON 스키마 파일로 지정할 수 있습니다. 중첩 또는 중첩 및 반복 열을 지정하려면 RECORD(STRUCT) 데이터 유형을 사용합니다.

중첩 및 반복 열 지정

BigQuery는 JSON 파일, Avro 파일, Cloud Firestore 내보내기 파일, Cloud Datastore 내보내기 파일과 같은 객체 기반 스키마를 지원하는 소스 형식의 중첩 및 반복 데이터를 로드하는 기능을 지원합니다.

예를 들어 도서관 도서를 추적하기 위해 사용되는 관계형 데이터베이스는 모든 저자 정보를 별개의 테이블로 유지할 가능성이 높습니다. 도서를 저자와 연결하기 위해서는 author_id와 같은 키가 사용될 것입니다.

BigQuery에서는 별개의 저자 테이블을 만들지 않아도 도서와 저자 사이의 관계를 보존할 수 있습니다. 대신 저자 열을 만들고 여기에 저자의 이름, 성, 생일 등과 같은 필드를 중첩할 수 있습니다. 한 도서의 저자가 여러 명인 경우 중첩된 저자 열을 반복 열로 만들 수 있습니다.

중첩 및 반복 데이터를 포함하는 열을 만들려면 열의 데이터 유형을 RECORD로 설정합니다. RECORDSTRUCT로 저장되며 표준 SQL에서 STRUCT로 액세스될 수 있습니다. STRUCT는 각각 유형(필수)과 이름(선택사항)을 포함하는 정렬된 필드의 컨테이너입니다. 중첩 열을 만들려면 RECORD(상위 요소)에 하위 필드를 추가합니다. 열을 반복 열로 만들려면 모드를 REPEATED로 변경합니다.

제한사항

중첩 및 반복 스키마에는 다음과 같은 제한사항이 적용됩니다.

  • 중첩 및 반복 데이터를 로드할 때 스키마에서 STRUCT(RECORD 유형)가 15개 수준을 초과하여 중첩될 수 없습니다.
    • BigQuery는 STRUCT(또는 RECORD) 유형의 열을 지원합니다. STRUCT는 하위 열이 여러 개인 객체를 나타내는 데 사용할 수 있는 복합 유형입니다. STRUCT 열에서는 하나 이상의 하위 열을 STRUCT 유형으로 정의할 수도 있습니다(중첩 또는 내장된 STRUCT라고 함). STRUCTS를 중첩할 경우 BigQuery에서는 중첩 깊이를 15개 수준으로 제한합니다. 중첩 깊이 제한은 STRUCT가 스칼라 기반이든 배열 기반이든 상관없이 적용됩니다.

스키마 예

다음 예는 샘플 중첩 및 반복 데이터를 보여줍니다. 이 테이블에는 여러 사람에 대한 정보가 포함되어 있습니다. 이 테이블은 다음과 같은 필드로 구성됩니다.

  • id
  • first_name
  • last_name
  • dob(생일)
  • addresses(중첩 및 반복 필드)
    • addresses.status(현재 또는 이전)
    • addresses.address
    • addresses.city
    • addresses.state
    • addresses.zip
    • addresses.numberOfYears(주소 연도)

JSON 데이터 파일은 다음과 같습니다. 주소 열에 값 배열([ ]로 표시)이 포함되는 것에 주의하세요. 배열의 여러 주소가 반복 데이터입니다. 각 주소 내의 여러 필드는 중첩 데이터입니다.

{"id":"1","first_name":"John","last_name":"Doe","dob":"1968-01-22","addresses":[{"status":"current","address":"123 First Avenue","city":"Seattle","state":"WA","zip":"11111","numberOfYears":"1"},{"status":"previous","address":"456 Main Street","city":"Portland","state":"OR","zip":"22222","numberOfYears":"5"}]}
{"id":"2","first_name":"Jane","last_name":"Doe","dob":"1980-10-16","addresses":[{"status":"current","address":"789 Any Avenue","city":"New York","state":"NY","zip":"33333","numberOfYears":"2"},{"status":"previous","address":"321 Main Street","city":"Hoboken","state":"NJ","zip":"44444","numberOfYears":"3"}]}

이 테이블의 스키마는 다음과 같습니다.

[
    {
        "name": "id",
        "type": "STRING",
        "mode": "NULLABLE"
    },
    {
        "name": "first_name",
        "type": "STRING",
        "mode": "NULLABLE"
    },
    {
        "name": "last_name",
        "type": "STRING",
        "mode": "NULLABLE"
    },
    {
        "name": "dob",
        "type": "DATE",
        "mode": "NULLABLE"
    },
    {
        "name": "addresses",
        "type": "RECORD",
        "mode": "REPEATED",
        "fields": [
            {
                "name": "status",
                "type": "STRING",
                "mode": "NULLABLE"
            },
            {
                "name": "address",
                "type": "STRING",
                "mode": "NULLABLE"
            },
            {
                "name": "city",
                "type": "STRING",
                "mode": "NULLABLE"
            },
            {
                "name": "state",
                "type": "STRING",
                "mode": "NULLABLE"
            },
            {
                "name": "zip",
                "type": "STRING",
                "mode": "NULLABLE"
            },
            {
                "name": "numberOfYears",
                "type": "STRING",
                "mode": "NULLABLE"
            }
        ]
    }
]

예의 중첩 및 반복 열 지정

콘솔

GCP Console에서 중첩 및 반복 addresses 열을 지정하려면 다음 안내를 따르세요.

  1. GCP Console에서 BigQuery 웹 UI를 엽니다.
    BigQuery 웹 UI로 이동

  2. 탐색 패널의 리소스 섹션에서 프로젝트를 확장하고 데이터세트를 선택합니다. 테이블 만들기를 클릭합니다. 데이터를 로드하는 프로세스는 빈 테이블을 만드는 프로세스와 동일합니다.

    테이블 만들기

  3. 테이블 만들기 페이지에서 다음을 수행합니다.

    • 소스빈 테이블을 선택합니다.

      테이블 소스 만들기

    • 대상에 데이터세트를 선택하고 테이블 이름 필드에 테이블 이름을 입력합니다.

    • 스키마에서 필드를 추가합니다.

      • 이름 필드에 addresses를 입력합니다.
      • 유형에서 RECORD를 선택합니다.
      • 모드에서 REPEATED를 선택합니다.

        주소 스키마

      • addresses 오른쪽에 있는 더하기 아이콘을 클릭하여 중첩 필드를 추가합니다.

        중첩 버튼

        • 이름 필드에 status를 입력합니다. 이 필드는 중첩 필드임을 나타내는 addresses.로 미리 채워져 있습니다.
        • 유형에서 STRING을 선택합니다.
        • 모드 값은 NULLABLE로 설정된 상태로 둡니다.

          상태 스키마

        • 위 단계를 반복하여 address(NULLABLE STRING), city(NULLABLE STRING), state(NULLABLE STRING), zip(NULLABLE STRING), numberOfYears(NULLABLE STRING)를 추가합니다.

    • 또는 텍스트로 수정을 클릭하고 스키마를 JSON 배열로 지정합니다.

기본 UI

기본 BigQuery 웹 UI에서 중첩 및 반복 addresses 열을 지정하려면 다음 안내를 따르세요.

  1. BigQuery 웹 UI로 이동합니다.

    BigQuery 웹 UI로 이동

  2. 탐색창에서 데이터세트 이름 옆에 있는 아래쪽 화살표 아이콘 아래쪽 화살표 아이콘을 클릭하고 새 테이블 만들기를 클릭합니다. 데이터를 로드하는 프로세스는 빈 테이블을 만드는 프로세스와 동일합니다.

  3. Create table(테이블 만들기) 페이지에서 다음 안내를 따릅니다.

    • 소스 데이터소스에서 만들기를 클릭합니다.
    • 대상 테이블에서 데이터세트를 선택하고 대상 테이블 이름 필드에 테이블 이름을 입력합니다.
    • 스키마에서 다음을 수행합니다.

      • 이름 필드에 addresses를 입력합니다.
      • 유형에서 RECORD를 선택합니다.
      • 모드에서 REPEATED를 선택합니다.
      • RECORD 오른쪽에 있는 더하기 아이콘 더하기 아이콘을 클릭하여 중첩 필드를 추가합니다.

        • 이름 필드에 status를 입력합니다. 이 필드는 중첩 필드임을 나타내는 addresses.로 미리 채워져 있습니다.
        • 유형에서 STRING을 선택합니다.
        • 모드 값은 NULLABLE로 설정된 상태로 둡니다.
        • 위 단계를 반복하여 address(NULLABLE STRING), city(NULLABLE STRING), state(NULLABLE STRING), zip(NULLABLE STRING), numberOfYears(NULLABLE STRING)를 추가합니다.

        UI의 중첩 필드

    • 또는 텍스트로 수정을 클릭하고 스키마를 JSON 배열로 지정합니다.

BigQuery 웹 UI에서 스키마를 조사할 때 addresses 필드는 다음과 같이 표시됩니다.

스키마 탭의 중첩 필드

명령줄

JSON 스키마 파일에서 중첩 및 반복 addresses 열을 지정하려면 텍스트 편집기를 사용하여 다음을 입력합니다.

[
    {
        "name": "id",
        "type": "STRING",
        "mode": "NULLABLE"
    },
    {
        "name": "first_name",
        "type": "STRING",
        "mode": "NULLABLE"
    },
    {
        "name": "last_name",
        "type": "STRING",
        "mode": "NULLABLE"
    },
    {
        "name": "dob",
        "type": "DATE",
        "mode": "NULLABLE"
    },
    {
        "name": "addresses",
        "type": "RECORD",
        "mode": "REPEATED",
        "fields": [
            {
                "name": "status",
                "type": "STRING",
                "mode": "NULLABLE"
            },
            {
                "name": "address",
                "type": "STRING",
                "mode": "NULLABLE"
            },
            {
                "name": "city",
                "type": "STRING",
                "mode": "NULLABLE"
            },
            {
                "name": "state",
                "type": "STRING",
                "mode": "NULLABLE"
            },
            {
                "name": "zip",
                "type": "STRING",
                "mode": "NULLABLE"
            },
            {
                "name": "numberOfYears",
                "type": "STRING",
                "mode": "NULLABLE"
            }
        ]
    }
]

JSON 스키마 파일을 만든 후에는 명령줄을 통해 이를 제공할 수 있습니다.

Go

이 샘플을 시도하기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용의 Go 설정 안내를 따르세요. 자세한 내용은 BigQuery Go API 참조 문서를 참조하세요.

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
sampleSchema := bigquery.Schema{
	{Name: "id", Type: bigquery.StringFieldType},
	{Name: "first_name", Type: bigquery.StringFieldType},
	{Name: "last_name", Type: bigquery.StringFieldType},
	{Name: "dob", Type: bigquery.DateFieldType},
	{Name: "addresses",
		Type:     bigquery.RecordFieldType,
		Repeated: true,
		Schema: bigquery.Schema{
			{Name: "status", Type: bigquery.StringFieldType},
			{Name: "address", Type: bigquery.StringFieldType},
			{Name: "city", Type: bigquery.StringFieldType},
			{Name: "state", Type: bigquery.StringFieldType},
			{Name: "zip", Type: bigquery.StringFieldType},
			{Name: "numberOfYears", Type: bigquery.StringFieldType},
		}},
}

metaData := &bigquery.TableMetadata{
	Schema: sampleSchema,
}
tableRef := client.Dataset(datasetID).Table(tableID)
if err := tableRef.Create(ctx, metaData); err != nil {
	return err
}
fmt.Printf("created table %s\n", tableRef.FullyQualifiedName())

Python

이 샘플을 시도해 보기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 BigQuery Python API 참조 문서를 확인하세요.

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_ref = client.dataset('my_dataset')

schema = [
    bigquery.SchemaField("id", "STRING", mode="NULLABLE"),
    bigquery.SchemaField("first_name", "STRING", mode="NULLABLE"),
    bigquery.SchemaField("last_name", "STRING", mode="NULLABLE"),
    bigquery.SchemaField("dob", "DATE", mode="NULLABLE"),
    bigquery.SchemaField(
        "addresses",
        "RECORD",
        mode="REPEATED",
        fields=[
            bigquery.SchemaField("status", "STRING", mode="NULLABLE"),
            bigquery.SchemaField("address", "STRING", mode="NULLABLE"),
            bigquery.SchemaField("city", "STRING", mode="NULLABLE"),
            bigquery.SchemaField("state", "STRING", mode="NULLABLE"),
            bigquery.SchemaField("zip", "STRING", mode="NULLABLE"),
            bigquery.SchemaField("numberOfYears", "STRING", mode="NULLABLE"),
        ],
    ),
]
table_ref = dataset_ref.table("my_table")
table = bigquery.Table(table_ref, schema=schema)
table = client.create_table(table)  # API request

print("Created table {}".format(table.full_table_id))

중첩 및 반복 열 수정

테이블의 스키마 정의에 중첩 열이나 중첩 및 반복 열을 추가한 후에는 다른 유형의 열과 마찬가지 방법으로 열을 수정할 수 있습니다. BigQuery는 레코드에 새 중첩 필드를 추가하거나 중첩 필드의 모드를 완화하는 등의 몇 가지 스키마 변경을 기본적으로 지원합니다. 자세한 내용은 테이블 스키마 수정을 참조하세요.

또한 중첩 및 반복 열을 포함하는 스키마 정의를 수동으로 수정할 수 있습니다. 자세한 내용은 테이블 스키마 수동 변경을 참조하세요.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.