Cloud Storage에서 Parquet 데이터 로드

이 페이지에서는 Cloud Storage의 Parquet 데이터를 BigQuery로 로드하는 방법을 간략히 설명합니다.

Parquet는 Apache Hadoop 생태계에서 널리 사용하는 오픈소스 열 기반 데이터 형식입니다.

Cloud Storage에서 Parquet 데이터를 로드할 때는 새 테이블 또는 파티션에 데이터를 로드하거나 기존 테이블 또는 파티션에 추가 또는 덮어쓸 수 있습니다. BigQuery에 로드한 데이터는 Capacitor용 열 형식(BigQuery의 저장소 형식)으로 변환됩니다.

Cloud Storage에서 BigQuery 테이블로 데이터를 로드할 때 테이블을 포함하는 데이터세트는 Cloud Storage 버킷과 동일한 지역 또는 다중 지역 위치에 있어야 합니다.

로컬 파일에서 Parquet 데이터를 로드하는 자세한 방법은 로컬 데이터 소스에서 BigQuery로 데이터 로드를 참조하세요.

Parquet 스키마

Parquet 파일을 BigQuery로 로드하면 테이블 스키마는 자기 기술 소스 데이터에서 자동으로 검색됩니다. BigQuery가 소스 데이터에서 스키마를 검색할 때는 알파벳순으로 마지막 파일이 사용됩니다.

예를 들어 Cloud Storage에 다음 Parquet 파일이 있습니다.

gs://mybucket/00/
  a.parquet
  z.parquet
gs://mybucket/01/
  b.parquet

이 명령어는 단일 CLI 명령어에 있는 모든 파일을 (쉼표로 구분된 목록으로) 로드하며, 스키마는 mybucket/01/b.parquet에서 추출됩니다.

bq --location=US load --source_format=PARQUET [DATASET].[TABLE] "gs://mybucket/00/*.parquet","gs://mybucket/01/*.parquet"

서로 다른 스키마가 있는 여러 Parquet 파일을 로드하는 경우 여러 스키마에 지정된 동일한 열은 각 스키마 정의에서 모드가 동일해야 합니다.

BigQuery가 스키마를 감지하면 일부 Parquet 데이터 유형은 BigQuery SQL 구문과 호환되도록 BigQuery 데이터 유형으로 변환됩니다. 자세한 내용은 Parquet 변환을 참조하세요.

Parquet 압축

압축된 Parquet 파일은 지원되지 않지만 압축된 데이터 블록은 지원됩니다. BigQuery는 Snappy 및 GZip 코덱을 지원합니다.

새 테이블에 Parquet 데이터 로드

Cloud Storage의 Parquet 데이터를 새 BigQuery 테이블로 로드하거나 기존 테이블에 데이터를 추가하는 방법은 다음과 같습니다.

기본 UI

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

  2. 탐색 패널에서 데이터세트에 마우스를 올려놓은 후 아래쪽 화살표 아이콘 아래쪽 화살표 아이콘 이미지을 클릭하고 새 테이블 만들기를 클릭합니다. 데이터를 로드하는 프로세스는 빈 테이블을 생성하는 프로세스와 동일합니다.

  3. 테이블 만들기 페이지의 소스 데이터 섹션에서 다음을 수행합니다.

    • 위치에서 Cloud Storage를 선택하고 소스 필드에 Cloud Storage URI를 입력합니다. BigQuery 웹 UI는 URI를 여러 개 포함할 수 없지만 와일드 카드는 지원됩니다. Cloud Storage 버킷은 생성 중인 테이블을 포함하는 데이터세트와 같은 위치에 있어야 합니다.
    • 파일 형식으로 Parquet를 선택합니다.
  4. 테이블 만들기 페이지의 대상 테이블 섹션에서 다음을 수행합니다.

    • 테이블 이름에서 적절한 데이터세트를 선택하고 테이블 이름 필드에 BigQuery에서 만들 테이블의 이름을 입력합니다.
    • 테이블 유형기본 테이블로 설정되어 있는지 확인합니다.
  5. 스키마 섹션은 그냥 두면 됩니다. 스키마는 Parquet 파일에서 자체 기술됩니다.

  6. 테이블 만들기를 클릭합니다.

명령줄

bq load 명령어를 사용하여 PARQUET를 source_format으로 지정하고 Cloud Storage URI를 포함합니다. 단일 URI, 쉼표로 구분된 URI 목록 또는 와일드 카드를 포함하는 URI를 입력할 수 있습니다.

--location 플래그를 제공하고 값을 사용자 위치로 설정합니다.

bq --location=[LOCATION] load --source_format=[FORMAT] [DATASET].[TABLE] [PATH_TO_SOURCE]

각 항목의 의미는 다음과 같습니다.

  • [LOCATION]은 사용자의 위치입니다. --location 플래그는 선택사항입니다. 예를 들어 도쿄 지역에서 BigQuery를 사용하는 경우 플래그 값을 asia-northeast1로 설정할 수 있습니다. .bigqueryrc 파일을 사용하여 위치 기본값을 설정할 수 있습니다.
  • [FORMAT]PARQUET입니다.
  • [DATASET]는 기존 데이터세트입니다.
  • [TABLE]은 데이터를 로드하는 테이블의 이름입니다.
  • [PATH_TO_SOURCE]는 정규화된 Cloud Storage URI 또는 쉼표로 구분된 URI 목록입니다. 와일드 카드도 지원됩니다.

예를 들면 다음과 같습니다.

  • 다음 명령어는 gs://mybucket/mydata.parquet에서 mydatasetmytable 테이블로 데이터를 로드합니다. mybucketmydatasetUS 다중 지역 위치에서 생성되었습니다.

    bq --location=US load --source_format=PARQUET mydataset.mytable gs://mybucket/mydata.parquet
    
  • 다음 명령어는 gs://mybucket/에 있는 여러 파일에서 mytable에 있는 mydataset이라는 테이블로 데이터를 로드합니다. Cloud Storage URI는 와일드 카드를 사용합니다. mybucketmydatasetUS 다중 지역 위치에서 생성되었습니다.

    bq --location=US load --source_format=PARQUET mydataset.mytable gs://mybucket/mydata*.parquet
    
  • 다음 명령어는 gs://mybucket/에 있는 여러 파일에서 mydataset에 있는 mytable이라는 테이블로 데이터를 로드합니다. 명령어에는 와일드 카드와 함께 쉼표로 구분된 Cloud Storage URI 목록이 포함됩니다. mybucketmydatasetasia-northeast1 지역에서 생성되었습니다.

    bq --location=asia-northeast1 load --autodetect --source_format=PARQUET mydataset.mytable "gs://mybucket/00/*.parquet","gs://mybucket/01/*.parquet"
    

API

API를 사용하여 Parquet 데이터를 로드하려면 다음 속성을 설정하세요.

  1. Cloud Storage의 소스 데이터를 가리키는 로드 작업을 만듭니다.

  2. 작업 리소스jobReference 섹션에 있는 location 속성에 위치를 지정합니다.

  3. 소스 URI는 gs://[BUCKET]/[OBJECT] 형식으로 정규화되어야 합니다. 각 URI는 '*' 와일드 카드 문자 하나를 포함할 수 있습니다.

  4. configuration.load.sourceFormat 속성을 PARQUET로 설정하여 Parquet 데이터 형식을 지정합니다.

  5. 작업 상태를 확인하려면 jobs.get([JOB_ID]*)를 호출합니다. 여기서 [JOB_ID]는 초기 요청에서 반환된 작업의 ID입니다.

    • status.state = DONE이면 작업이 성공적으로 완료된 것입니다.
    • status.errorResult 속성이 있는 경우 요청은 실패한 것이며, 해당 객체에 문제의 원인을 설명하는 정보가 포함됩니다. 요청이 실패하면 테이블이 생성되지 않고 데이터가 추가되지 않습니다.
    • status.errorResult가 없으면 작업은 성공적으로 끝났지만 일부 행을 올바르게 가져오지 못하는 등의 치명적이지 않은 오류가 존재할 수도 있습니다. 치명적이지 않은 오류는 반환된 작업 객체의 status.errors 속성에 나열됩니다.

API 참고:

  • 로드 작업은 원자 수준으로 이루어지며 일관성을 가집니다. 로드 작업이 실패하면 어떤 데이터도 사용할 수 없으며, 로드 작업이 성공하면 모든 데이터를 사용할 수 있습니다.

  • 권장사항은 jobs.insert()를 호출하여 로드 작업을 만들 때 고유 ID를 생성하여 jobReference.jobId로 전달하는 것입니다. 이 방법은 클라이언트가 알려진 작업 ID로 폴링하거나 재시도할 수 있으므로 네트워크 장애 시에도 더 안정적입니다.

  • 특정한 작업 ID에 대한 jobs.insert() 호출은 멱등적입니다. 즉, 같은 작업 ID로 원하는 만큼 다시 시도할 수 있으며 최대 한번만 성공합니다.

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")
gcsRef := bigquery.NewGCSReference("gs://cloud-samples-data/bigquery/us-states/us-states.parquet")
gcsRef.SourceFormat = bigquery.Parquet
gcsRef.AutoDetect = true
loader := client.Dataset(datasetID).Table(tableID).LoaderFrom(gcsRef)

job, err := loader.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}

if status.Err() != nil {
	return fmt.Errorf("Job completed with error: %v", status.Err())
}

자바

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

String sourceUri = "gs://cloud-samples-data/bigquery/us-states/us-states.parquet";
TableId tableId = TableId.of(datasetName, "us_states");
LoadJobConfiguration configuration =
        LoadJobConfiguration.builder(tableId, sourceUri)
                .setFormatOptions(FormatOptions.parquet())
                .build();
// Load the table
Job loadJob = bigquery.create(JobInfo.of(configuration));
loadJob = loadJob.waitFor();
// Check the table
StandardTableDefinition destinationTable = bigquery.getTable(tableId).getDefinition();
System.out.println("State: " + loadJob.getStatus().getState());
System.out.printf("Loaded %d rows.\n", destinationTable.getNumRows());

Node.js

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

// Imports the Google Cloud client libraries
const {BigQuery} = require('@google-cloud/bigquery');
const {Storage} = require('@google-cloud/storage');

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const projectId = "your-project-id";
// const datasetId = "my_dataset";
// const tableId = "my_table";

/**
 * This sample loads the Parquet file at
 * https://storage.googleapis.com/cloud-samples-data/bigquery/us-states/us-states.parquet
 *
 * TODO(developer): Replace the following lines with the path to your file.
 */
const bucketName = 'cloud-samples-data';
const filename = 'bigquery/us-states/us-states.parquet';

// Instantiates clients
const bigquery = new BigQuery({projectId});
const storage = new Storage({projectId});

// Configure the load job. For full list of options, see:
// https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs#configuration.load
const metadata = {
  sourceFormat: 'PARQUET',
};

// Loads data from a Google Cloud Storage file into the table
const [job] = await bigquery
  .dataset(datasetId)
  .table(tableId)
  .load(storage.bucket(bucketName).file(filename), metadata);

// load() waits for the job to finish
console.log(`Job ${job.id} completed.`);

// Check the job's status for errors
const errors = job.status.errors;
if (errors && errors.length > 0) {
  throw errors;
}

PHP

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

use Google\Cloud\BigQuery\BigQueryClient;
use Google\Cloud\Core\ExponentialBackoff;

/** Uncomment and populate these variables in your code */
// $projectId  = 'The Google project ID';
// $datasetId  = 'The BigQuery dataset ID';

// instantiate the bigquery table service
$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$dataset = $bigQuery->dataset($datasetId);
$table = $dataset->table('us_states');

// create the import job
$gcsUri = 'gs://cloud-samples-data/bigquery/us-states/us-states.parquet';
$loadConfig = $table->loadFromStorage($gcsUri)->sourceFormat('PARQUET');
$job = $table->runJob($loadConfig);
// poll the job until it is complete
$backoff = new ExponentialBackoff(10);
$backoff->execute(function () use ($job) {
    print('Waiting for job to complete' . PHP_EOL);
    $job->reload();
    if (!$job->isComplete()) {
        throw new Exception('Job has not yet completed', 500);
    }
});
// check if the job has errors
if (isset($job->info()['status']['errorResult'])) {
    $error = $job->info()['status']['errorResult']['message'];
    printf('Error running job: %s' . PHP_EOL, $error);
} else {
    print('Data imported successfully' . PHP_EOL);
}

Python

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

Client.load_table_from_uri() 메소드를 사용하여 Cloud Storage에서 로드 작업을 시작합니다. Parquet를 사용하려면 LoadJobConfig.source_format 속성을 SourceFormat 상수 PARQUET로 설정하고 작업 구성을 job_config 인수로 load_table_from_uri() 메소드에 전달합니다.

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

dataset_ref = client.dataset(dataset_id)
job_config = bigquery.LoadJobConfig()
job_config.source_format = bigquery.SourceFormat.PARQUET
uri = 'gs://cloud-samples-data/bigquery/us-states/us-states.parquet'

load_job = client.load_table_from_uri(
    uri,
    dataset_ref.table('us_states'),
    job_config=job_config)  # API request
print('Starting job {}'.format(load_job.job_id))

load_job.result()  # Waits for table load to complete.
print('Job finished.')

destination_table = client.get_table(dataset_ref.table('us_states'))
print('Loaded {} rows.'.format(destination_table.num_rows))

Parquet 데이터로 테이블 덮어쓰기

소스 파일에서 또는 쿼리 결과를 추가하여 테이블에 추가 데이터를 로드할 수 있습니다.

콘솔 또는 기본 BigQuery 웹 UI에서 쓰기 환경설정 옵션을 사용하여 소스 파일 또는 쿼리 결과에서 데이터를 로드할 때 수행할 작업을 지정합니다.

추가 데이터를 테이블에 로드할 때 다음 옵션을 사용할 수 있습니다.

콘솔 옵션 기본 UI 옵션 CLI 플래그 BigQuery API 속성 설명
비어 있으면 쓰기 비어 있으면 쓰기 없음 WRITE_EMPTY 테이블이 비어 있는 경우에만 데이터를 씁니다.
테이블에 추가 테이블에 추가 --noreplace 또는 --replace=false. --[no]replace를 지정하지 않으면 기본값은 추가입니다. WRITE_APPEND (기본값) 데이터를 테이블 끝에 추가합니다.
테이블 덮어쓰기 테이블 덮어쓰기 --replace 또는 --replace=true WRITE_TRUNCATE 새 데이터를 쓰기 전에 테이블의 기존 데이터를 모두 지웁니다.

기본적으로 쓰기 처리가 변경되지 않으면 로드 작업이 테이블에 데이터를 추가합니다. 로드 작업의 데이터로 데이터를 대체하려면 BigQuery 테이블의 데이터를 덮어쓰도록 선택할 수 있습니다.

기본 UI

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

  2. 탐색 패널에서 데이터세트에 마우스를 올려놓은 후 아래쪽 화살표 아이콘 아래쪽 화살표 아이콘 이미지을 클릭하고 새 테이블 만들기를 클릭합니다. 데이터를 로드하는 프로세스는 빈 테이블을 생성하는 프로세스와 동일합니다.

  3. 테이블 만들기 페이지의 소스 데이터 섹션에서 다음을 수행합니다.

    • 위치에서 Cloud Storage를 선택하고 소스 필드에 Cloud Storage URI를 입력합니다. UI는 URI를 여러 개 포함할 수 없지만 와일드 카드는 지원됩니다. Cloud Storage 버킷은 추가하거나 덮어쓰는 테이블을 포함하는 데이터세트와 같은 위치에 있어야 합니다.
    • 파일 형식으로 Parquet를 선택합니다.
  4. 테이블 만들기 페이지의 대상 테이블 섹션에서 다음을 수행합니다.

    • 테이블 이름에서 적당한 데이터세트를 선택하고 테이블 이름 필드에 추가하거나 덮어쓰는 테이블의 이름을 입력합니다.
    • 테이블 유형기본 테이블로 설정되어 있는지 확인합니다.
  5. 스키마 섹션은 그냥 두면 됩니다. 스키마 정보는 Parquet 파일에서 자체 기술됩니다.

  6. 옵션 섹션의 쓰기 환경설정에서 비어 있으면 쓰기, 테이블에 추가 또는 테이블 덮어쓰기를 선택합니다.

    필드 추가를 사용하여 스키마 추가

  7. 테이블 만들기를 클릭합니다.

명령줄

테이블을 덮어쓰려면 bq load 명령어를 --replace 플래그와 함께 입력합니다. --location 플래그를 제공하고 값을 사용자 위치로 설정합니다. --noreplace 플래그를 사용하여 데이터를 테이블에 추가합니다. 플래그를 지정하지 않으면 데이터 추가가 기본값입니다.

bq --location=[LOCATION] load --[no]replace [DATASET].[TABLE] [PATH_TO_SOURCE]

각 항목의 의미는 다음과 같습니다.

  • [LOCATION]은 사용자의 위치입니다. --location 플래그는 선택사항입니다. .bigqueryrc 파일을 사용하여 위치 기본값을 설정할 수 있습니다.
  • [DATASET]는 기존 데이터세트입니다.
  • [TABLE]은 데이터를 로드하는 테이블의 이름입니다.
  • [PATH_TO_SOURCE]는 정규화된 Cloud Storage URI 또는 쉼표로 구분된 URI 목록입니다. 와일드 카드도 지원됩니다.

예를 들면 다음과 같습니다.

  • 다음 명령어는 gs://mybucket/mydata.parquet에서 데이터를 로드하여 mydatasetmytable 테이블을 덮어씁니다. mybucketmydatasetUS 다중 지역 위치에서 생성되었습니다.

    bq --location=US load --replace --source_format=PARQUET mydataset.mytable gs://mybucket/mydata.parquet
    
  • 다음 명령어는 gs://mybucket/mydata.parquet에서 데이터를 로드하여 mydatasetmytable 테이블에 데이터를 추가합니다. mybucketmydatasetasia-northeast1 지역에서 생성되었습니다.

    bq --location=asia-northeast1 load --noreplace --source_format=PARQUET mydataset.mytable gs://mybucket/mydata.parquet
    

API

API를 사용하여 CSV 데이터를 로드하려면 다음 속성을 설정하세요.

  1. Cloud Storage의 소스 데이터를 가리키는 로드 작업을 만듭니다.

  2. 작업 리소스jobReference 섹션에 있는 location 속성에 위치를 지정합니다.

  3. 소스 URI는 gs://[BUCKET]/[OBJECT] 형식으로 정규화되어야 합니다. 여러 URI를 쉼표로 구분된 목록으로 포함할 수 있습니다. Cloud Storage에서 CSV 데이터를 로드할 때는 와일드 카드도 사용 가능합니다.

  4. configuration.load.sourceFormat 속성을 PARQUET로 설정하여 데이터 형식을 지정합니다.

  5. configuration.load.writeDisposition 속성을 WRITE_TRUNCATE, WRITE_APPEND, WRITE_EMPTY로 설정하여 쓰기 환경설정을 지정합니다.

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")
gcsRef := bigquery.NewGCSReference("gs://cloud-samples-data/bigquery/us-states/us-states.parquet")
gcsRef.SourceFormat = bigquery.Parquet
gcsRef.AutoDetect = true
loader := client.Dataset(datasetID).Table(tableID).LoaderFrom(gcsRef)
loader.WriteDisposition = bigquery.WriteTruncate

job, err := loader.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}

if status.Err() != nil {
	return fmt.Errorf("Job completed with error: %v", status.Err())
}

Node.js

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

// Imports the Google Cloud client libraries
const {BigQuery} = require('@google-cloud/bigquery');
const {Storage} = require('@google-cloud/storage');

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const projectId = "your-project-id";
// const datasetId = "my_dataset";
// const tableId = "my_table";

/**
 * This sample loads the CSV file at
 * https://storage.googleapis.com/cloud-samples-data/bigquery/us-states/us-states.csv
 *
 * TODO(developer): Replace the following lines with the path to your file.
 */
const bucketName = 'cloud-samples-data';
const filename = 'bigquery/us-states/us-states.parquet';

// Instantiates clients
const bigquery = new BigQuery({
  projectId: projectId,
});

const storage = new Storage({
  projectId: projectId,
});

// Configure the load job. For full list of options, see:
// https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs#configuration.load
const metadata = {
  sourceFormat: 'PARQUET',
  // Set the write disposition to overwrite existing table data.
  writeDisposition: 'WRITE_TRUNCATE',
};

// Loads data from a Google Cloud Storage file into the table
const [job] = await bigquery
  .dataset(datasetId)
  .table(tableId)
  .load(storage.bucket(bucketName).file(filename), metadata);
// load() waits for the job to finish
console.log(`Job ${job.id} completed.`);

// Check the job's status for errors
const errors = job.status.errors;
if (errors && errors.length > 0) {
  throw errors;
}

PHP

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

use Google\Cloud\BigQuery\BigQueryClient;
use Google\Cloud\Core\ExponentialBackoff;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $datasetId = 'The BigQuery dataset ID';
// $tableID = 'The BigQuery table ID';

// instantiate the bigquery table service
$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$table = $bigQuery->dataset($datasetId)->table($tableId);

// create the import job
$gcsUri = 'gs://cloud-samples-data/bigquery/us-states/us-states.parquet';
$loadConfig = $table->loadFromStorage($gcsUri)->sourceFormat('PARQUET')->writeDisposition('WRITE_TRUNCATE');
$job = $table->runJob($loadConfig);

// poll the job until it is complete
$backoff = new ExponentialBackoff(10);
$backoff->execute(function () use ($job) {
    print('Waiting for job to complete' . PHP_EOL);
    $job->reload();
    if (!$job->isComplete()) {
        throw new Exception('Job has not yet completed', 500);
    }
});

// check if the job has errors
if (isset($job->info()['status']['errorResult'])) {
    $error = $job->info()['status']['errorResult']['message'];
    printf('Error running job: %s' . PHP_EOL, $error);
} else {
    print('Data imported successfully' . PHP_EOL);
}

Python

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

기존 테이블의 행을 대체하려면 LoadJobConfig.write_disposition 속성을 WriteDisposition 상수 WRITE_TRUNCATE로 설정합니다.

# from google.cloud import bigquery
# client = bigquery.Client()
# table_ref = client.dataset('my_dataset').table('existing_table')

previous_rows = client.get_table(table_ref).num_rows
assert previous_rows > 0

job_config = bigquery.LoadJobConfig()
job_config.write_disposition = bigquery.WriteDisposition.WRITE_TRUNCATE
job_config.source_format = bigquery.SourceFormat.PARQUET
uri = 'gs://cloud-samples-data/bigquery/us-states/us-states.parquet'
load_job = client.load_table_from_uri(
    uri,
    table_ref,
    job_config=job_config)  # API request
print('Starting job {}'.format(load_job.job_id))

load_job.result()  # Waits for table load to complete.
print('Job finished.')

destination_table = client.get_table(table_ref)
print('Loaded {} rows.'.format(destination_table.num_rows))

Parquet 변환

BigQuery는 Parquet 데이터 유형을 다음 BigQuery 데이터 유형으로 변환합니다.

유형 변환

Parquet 유형 Parquet 변환된 유형 BigQuery 데이터 유형
BOOLEAN 없음 부울
INT32 NONE, UINT_8, UINT_16, UINT_32, INT_8, INT_16, INT_32 정수
INT32 DECIMAL(DECIMAL 주석 참조) 숫자
INT32 DATE 날짜
INT64 NONE, UINT_64, INT_64 정수
INT64 DECIMAL(DECIMAL 주석 참조) 숫자
INT64 TIMESTAMP_MILLIS 타임스탬프
INT64 TIMESTAMP_MICROS 타임스탬프
INT96 없음 타임스탬프
FLOAT 없음 부동 소수점
DOUBLE 없음 부동 소수점
BYTE_ARRAY 없음 바이트
BYTE_ARRAY UTF8 문자열
FIXED_LEN_BYTE_ARRAY DECIMAL(DECIMAL 주석 참조) 숫자
FIXED_LEN_BYTE_ARRAY 없음 바이트

다른 Parquet 유형 및 변환된 유형 조합은 지원되지 않습니다.

Decimal 주석

DECIMAL 주석이 있는 Parquet 유형의 최대 정밀도는 38(총 자릿수) 최대 소수 자릿수는 9(소수점 오른쪽 자릿수)입니다. 정수 자릿수는 정밀도 빼기 소수 자릿수이며, 최대 29입니다. 예를 들어 DECIMAL(38, 9)는 정밀도가 38이고 소수 자릿수가 9이므로 지원됩니다. 이 예에서 정수 자릿수는 29입니다. DECIMAL(38, 5)의 경우 정밀도가 38이고 소수 자릿수가 5이므로 지원되지 않습니다. 이 예에서 정수 자릿수는 33입니다.

열 이름 변환

열 이름은 문자(a-z, A-Z), 숫자(0-9) 또는 밑줄(_)만 포함해야 하며 문자 또는 밑줄로 시작해야 합니다. 최대 열 이름 길이는 128자입니다. 열 이름은 다음과 같은 프리픽스를 사용할 수 없습니다.

  • _TABLE_
  • _FILE_
  • _PARTITION

중복 열 이름은 대소문자가 다른 경우라도 허용되지 않습니다. 예를 들어 이름이 Column1인 열과 이름이 column1인 열은 동일한 것으로 간주됩니다.

열 이름에 마침표(.)가 있는 열이 포함된 Parquet 파일은 현재 로드할 수 없습니다.

Parquet 열 이름에 다른 문자(마침표 이외)가 포함된 경우 해당 문자는 밑줄로 대체됩니다. 충돌을 피하기 위해 열 이름 끝에 밑줄이 추가될 수 있습니다. 예를 들어 Parquet 파일에 Column1column1, 두 개의 열이 포함되는 경우 각각 Column1column1_로 로드됩니다.

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

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

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