Python 클라이언트 라이브러리 v0.27에서 마이그레이션

Python v0.28용 BigQuery 클라이언트 라이브러리에서는 v0.27 이전 버전과 비교하여 클라이언트 라이브러리의 설계 방식 일부가 크게 변경되었습니다. 변경사항은 다음과 같습니다.

  • 기본적으로 쿼리 및 뷰 작업은 표준 SQL 언어를 사용합니다.
  • 작업(예: 쿼리 실행)과 관련된 클라이언트 함수는 작업을 즉시 시작합니다.
  • 데이터 세트와 테이블 만들기, 가져오기, 업데이트, 삭제를 수행하는 함수가 클라이언트 클래스로 이동했습니다.

이 주제에서는 최신 버전의 Python 클라이언트 라이브러리를 사용하기 위해 BigQuery 클라이언트 라이브러리에 필요한 Python 코드 변경 사항을 자세히 설명합니다.

이전 버전의 클라이언트 라이브러리 실행

Python 클라이언트 라이브러리를 최신 버전으로 업그레이드할 필요는 없습니다. 그러나 BigQuery API의 새로운 기능은 v0.28 및 이후 버전에서만 지원됩니다.

이전 버전의 Python 클라이언트 라이브러리를 계속 사용하고 코드를 마이그레이션하지 않으려면 앱에서 사용되는 Python 클라이언트 라이브러리 버전을 지정합니다. 특정 라이브러리 버전을 지정하려면 requirements.txt 파일을 다음과 같이 편집합니다.

google-cloud-bigquery==0.27

클라이언트 라이브러리의 최신 버전 실행

최신 버전의 Python 클라이언트 라이브러리를 설치하려면 pip 명령어를 사용합니다.

pip install --upgrade google-cloud-bigquery

자세한 내용은 BigQuery 클라이언트 라이브러리를 참조하세요.

라이브러리 가져오기 및 클라이언트 만들기

Python 클라이언트 라이브러리를 가져오고 클라이언트 객체를 만드는 방법은 이전 버전과 최신 버전의 라이브러리에서 모두 동일합니다.

from google.cloud import bigquery

client = bigquery.Client()

쿼리 코드 변경

표준 SQL 언어로 데이터 쿼리

v0.28 및 이후 버전의 변경 사항은 다음과 같습니다.

  • 표준 SQL이 기본 SQL 언어입니다.
  • QueryJobConfig 클래스를 사용하여 쿼리 작업을 구성합니다.
  • client.query()는 즉시 쿼리를 시작하라는 API 요청을 합니다.
  • 작업 ID는 선택사항입니다. 입력하지 않으면 클라이언트 라이브러리에서 임의로 생성됩니다.

다음 샘플은 쿼리 실행 방법을 보여줍니다.

이전 버전의 클라이언트 라이브러리:

client = bigquery.Client()
query_job = client.run_async_query(str(uuid.uuid4()), query)

# Use standard SQL syntax.
query_job.use_legacy_sql = False

# Set a destination table.
dest_dataset = client.dataset(dest_dataset_id)
dest_table = dest_dataset.table(dest_table_id)
query_job.destination = dest_table

# Allow the results table to be overwritten.
query_job.write_disposition = 'WRITE_TRUNCATE'

query_job.begin()
query_job.result()  # Wait for query to finish.

rows = query_job.query_results().fetch_data()
for row in rows:
    print(row)

0.25.0 또는 그 이전 버전의 google-cloud-bigquery 라이브러리에서는 작업 객체가 끝날 때까지 기다리기 위해 job.result() 대신 다음 코드가 필요했습니다.

while True:
    job.reload()  # Refreshes the state by using a GET request.
    if job.state == 'DONE':
        if job.error_result:
            raise RuntimeError(job.errors)
        return
    time.sleep(1)

0.25.0 또는 이전 버전의 google-cloud-bigquery 라이브러리에서는 결과 행을 가져오기 위해 job.query_results().fetch_data() 대신 다음 코드가 사용되었습니다.

rows = query_job.results().fetch_data()

최신 버전의 클라이언트 라이브러리:

기본적으로 Python 클라이언트 라이브러리는 이제 표준 SQL을 사용합니다.

Python

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


from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

query = """
    SELECT name, SUM(number) as total_people
    FROM `bigquery-public-data.usa_names.usa_1910_2013`
    WHERE state = 'TX'
    GROUP BY name, state
    ORDER BY total_people DESC
    LIMIT 20
"""
query_job = client.query(query)  # Make an API request.

print("The query data:")
for row in query_job:
    # Row values can be accessed by field name or index.
    print("name={}, count={}".format(row[0], row["total_people"]))

최신 버전의 Python 클라이언트 라이브러리로 쿼리를 실행하는 또 다른 샘플은 다음을 참조하세요.

쿼리 결과를 Pandas DataFrame으로 다운로드

다음 샘플은 쿼리 실행 방법을 보여주고 결과를 Pandas DataFrame으로 다운로드합니다.

이전 버전의 클라이언트 라이브러리:

이전 버전의 클라이언트 라이브러리는 결과를 Pandas DataFrame으로 다운로드하는 것을 지원하지 않았습니다.

최신 버전의 클라이언트 라이브러리:

Python

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

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

sql = """
    SELECT name, SUM(number) as count
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    GROUP BY name
    ORDER BY count DESC
    LIMIT 10
"""

df = client.query(sql).to_dataframe()

Legacy SQL 언어로 데이터 쿼리

다음 샘플은 legacy SQL 언어를 사용하여 쿼리를 실행하는 방법을 보여줍니다.

이전 버전의 클라이언트 라이브러리:

이전 버전의 클라이언트 라이브러리에서는 기본적으로 legacy SQL 구문을 사용했습니다. 쿼리 구성 및 실행 방법은 쿼리 샘플을 참조하세요.

최신 버전의 클라이언트 라이브러리:

기본적으로 클라이언트 라이브러리에서는 표준 SQL 구문을 사용합니다. legacy SQL을 사용하려면 use_legacy_sql을 true로 설정합니다. 쿼리 구성 및 실행 방법은 쿼리 샘플을 참조하세요.

데이터를 동기식으로 쿼리

v0.28 및 이후 버전에서는 Client.query() 메서드를 사용하는 것이 좋습니다. QueryJob에서 쿼리의 통계와 기타 속성에 액세스할 수 있기 때문입니다.

이전 버전의 클라이언트 라이브러리:

query_results = client.run_sync_query(query)
query_results.use_legacy_sql = False

query_results.run()

# The query might not complete in a single request. To account for a
# long-running query, force the query results to reload until the query
# is complete.
while not query_results.complete:
  query_iterator = query_results.fetch_data()
  try:
     six.next(iter(query_iterator))
  except StopIteration:
      pass

rows = query_results.fetch_data()
for row in rows:
    print(row)

최신 버전의 클라이언트 라이브러리:

Python

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


from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

query = """
    SELECT name, SUM(number) as total_people
    FROM `bigquery-public-data.usa_names.usa_1910_2013`
    WHERE state = 'TX'
    GROUP BY name, state
    ORDER BY total_people DESC
    LIMIT 20
"""
query_job = client.query(query)  # Make an API request.

print("The query data:")
for row in query_job:
    # Row values can be accessed by field name or index.
    print("name={}, count={}".format(row[0], row["total_people"]))

테이블 코드 변경

테이블 참조

속성을 추가하지 않고 테이블을 참조하려면 TableReference 객체를 사용하고, 전체 테이블 리소스를 참조하려면 Table을 사용합니다. 이전에 Table 클래스를 사용했던 여러 속성이 v0.28 및 이후 버전에서는 TableReference 클래스를 사용합니다. 예를 들면 다음과 같습니다.

  • QueryJob.destination은 이제 TableReference입니다.
  • 이제 client.dataset('mydataset').table('mytable')TableReference를 반환합니다.

TableReference 클래스와 Table 클래스를 모두 사용하는 예시는 테이블을 만드는 방법을 참조하세요.

로컬 파일에서 데이터 로드

다음 샘플은 로컬 파일을 BigQuery 테이블에 로드하는 방법을 보여줍니다.

이전 버전의 클라이언트 라이브러리:

dataset = client.dataset(dataset_name)
table = dataset.table(table_name)

# Reload the table to get the schema.
table.reload()

with open(source_file_name, 'rb') as source_file:
    # This example uses CSV, but you can use other formats.
    # See https://cloud.google.com/bigquery/docs/loading-data
    job = table.upload_from_file(
        source_file, source_format='text/csv')

# Wait for the load job to complete.
while True:
    job.reload()
    if job.state == 'DONE':
        if job.error_result:
            raise RuntimeError(job.errors)
        return
    time.sleep(1)

최신 버전의 클라이언트 라이브러리:

Python

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

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set table_id to the ID of the table to create.
# table_id = "your-project.your_dataset.your_table_name"

job_config = bigquery.LoadJobConfig(
    source_format=bigquery.SourceFormat.CSV, skip_leading_rows=1, autodetect=True,
)

with open(file_path, "rb") as source_file:
    job = client.load_table_from_file(source_file, table_id, job_config=job_config)

job.result()  # Waits for the job to complete.

table = client.get_table(table_id)  # Make an API request.
print(
    "Loaded {} rows and {} columns to {}".format(
        table.num_rows, len(table.schema), table_id
    )
)

자세한 내용은 로컬 데이터 소스에서 데이터 로드를 참조하세요.

Pandas DataFrame에서 데이터 로드

다음 샘플은 BigQuery 테이블에 pandas dataframe을 업로드하는 방법을 나타낸 것입니다.

이전 버전의 클라이언트 라이브러리:

이전 버전의 클라이언트 라이브러리는 Pandas DataFrame에서 데이터를 업로드하는 것을 지원하지 않았습니다.

최신 버전의 클라이언트 라이브러리:

Python

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

import datetime

from google.cloud import bigquery
import pandas
import pytz

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set table_id to the ID of the table to create.
# table_id = "your-project.your_dataset.your_table_name"

records = [
    {
        "title": u"The Meaning of Life",
        "release_year": 1983,
        "length_minutes": 112.5,
        "release_date": pytz.timezone("Europe/Paris")
        .localize(datetime.datetime(1983, 5, 9, 13, 0, 0))
        .astimezone(pytz.utc),
        # Assume UTC timezone when a datetime object contains no timezone.
        "dvd_release": datetime.datetime(2002, 1, 22, 7, 0, 0),
    },
    {
        "title": u"Monty Python and the Holy Grail",
        "release_year": 1975,
        "length_minutes": 91.5,
        "release_date": pytz.timezone("Europe/London")
        .localize(datetime.datetime(1975, 4, 9, 23, 59, 2))
        .astimezone(pytz.utc),
        "dvd_release": datetime.datetime(2002, 7, 16, 9, 0, 0),
    },
    {
        "title": u"Life of Brian",
        "release_year": 1979,
        "length_minutes": 94.25,
        "release_date": pytz.timezone("America/New_York")
        .localize(datetime.datetime(1979, 8, 17, 23, 59, 5))
        .astimezone(pytz.utc),
        "dvd_release": datetime.datetime(2008, 1, 14, 8, 0, 0),
    },
    {
        "title": u"And Now for Something Completely Different",
        "release_year": 1971,
        "length_minutes": 88.0,
        "release_date": pytz.timezone("Europe/London")
        .localize(datetime.datetime(1971, 9, 28, 23, 59, 7))
        .astimezone(pytz.utc),
        "dvd_release": datetime.datetime(2003, 10, 22, 10, 0, 0),
    },
]
dataframe = pandas.DataFrame(
    records,
    # In the loaded table, the column order reflects the order of the
    # columns in the DataFrame.
    columns=[
        "title",
        "release_year",
        "length_minutes",
        "release_date",
        "dvd_release",
    ],
    # Optionally, set a named index, which can also be written to the
    # BigQuery table.
    index=pandas.Index(
        [u"Q24980", u"Q25043", u"Q24953", u"Q16403"], name="wikidata_id"
    ),
)
job_config = bigquery.LoadJobConfig(
    # Specify a (partial) schema. All columns are always written to the
    # table. The schema is used to assist in data type definitions.
    schema=[
        # Specify the type of columns whose type cannot be auto-detected. For
        # example the "title" column uses pandas dtype "object", so its
        # data type is ambiguous.
        bigquery.SchemaField("title", bigquery.enums.SqlTypeNames.STRING),
        # Indexes are written if included in the schema by name.
        bigquery.SchemaField("wikidata_id", bigquery.enums.SqlTypeNames.STRING),
    ],
    # Optionally, set the write disposition. BigQuery appends loaded rows
    # to an existing table by default, but with WRITE_TRUNCATE write
    # disposition it replaces the table with the loaded data.
    write_disposition="WRITE_TRUNCATE",
)

job = client.load_table_from_dataframe(
    dataframe, table_id, job_config=job_config
)  # Make an API request.
job.result()  # Wait for the job to complete.

table = client.get_table(table_id)  # Make an API request.
print(
    "Loaded {} rows and {} columns to {}".format(
        table.num_rows, len(table.schema), table_id
    )
)

Cloud Storage에서 데이터 로드

다음 샘플에서는 파일을 Cloud Storage에서 BigQuery 테이블로 로드하는 방법을 보여줍니다.

이전 버전의 클라이언트 라이브러리:

dataset = client.dataset(dataset_name)
table = dataset.table(table_name)
job_id = str(uuid.uuid4())

job = client.load_table_from_storage(
    job_id, table, 'gs://bucket_name/object_name')
job.begin()

# Wait for the load job to complete.
while True:
    job.reload()
    if job.state == 'DONE':
        if job.error_result:
            raise RuntimeError(job.errors)
        return
    time.sleep(1)

최신 버전의 클라이언트 라이브러리:

Python

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

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set table_id to the ID of the table to create.
# table_id = "your-project.your_dataset.your_table_name"

job_config = bigquery.LoadJobConfig(
    schema=[
        bigquery.SchemaField("name", "STRING"),
        bigquery.SchemaField("post_abbr", "STRING"),
    ],
    skip_leading_rows=1,
    # The source format defaults to CSV, so the line below is optional.
    source_format=bigquery.SourceFormat.CSV,
)
uri = "gs://cloud-samples-data/bigquery/us-states/us-states.csv"

load_job = client.load_table_from_uri(
    uri, table_id, job_config=job_config
)  # Make an API request.

load_job.result()  # Waits for the job to complete.

destination_table = client.get_table(table_id)  # Make an API request.
print("Loaded {} rows.".format(destination_table.num_rows))

자세한 내용은 Cloud Storage에서 데이터 로드를 참조하세요.

Cloud Storage로 테이블 추출

다음 샘플에서는 테이블을 Cloud Storage로 추출하는 방법을 보여줍니다.

이전 버전의 클라이언트 라이브러리:

dataset = client.dataset(dataset_name)
table = dataset.table(table_name)
job_id = str(uuid.uuid4())

job = client.extract_table_to_storage(
    job_id, table, 'gs://bucket_name/object_name')
job.begin()

# Wait for the job to complete.
while True:
    job.reload()
    if job.state == 'DONE':
        if job.error_result:
            raise RuntimeError(job.errors)
        return
    time.sleep(1)

최신 버전의 클라이언트 라이브러리:

Python

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

# from google.cloud import bigquery
# client = bigquery.Client()
# bucket_name = 'my-bucket'
project = "bigquery-public-data"
dataset_id = "samples"
table_id = "shakespeare"

destination_uri = "gs://{}/{}".format(bucket_name, "shakespeare.csv")
dataset_ref = bigquery.DatasetReference(project, dataset_id)
table_ref = dataset_ref.table(table_id)

extract_job = client.extract_table(
    table_ref,
    destination_uri,
    # Location must match that of the source table.
    location="US",
)  # API request
extract_job.result()  # Waits for job to complete.

print(
    "Exported {}:{}.{} to {}".format(project, dataset_id, table_id, destination_uri)
)

자세한 내용은 테이블 데이터 내보내기를 참조하세요.

테이블 복사

다음 샘플은 테이블을 다른 테이블에 복사하는 방법을 보여줍니다.

이전 버전의 클라이언트 라이브러리:

dataset = client.dataset(dataset_name)
table = dataset.table(table_name)
destination_table = dataset.table(new_table_name)

job_id = str(uuid.uuid4())
job = client.copy_table(job_id, destination_table, table)

job.create_disposition = (
        google.cloud.bigquery.job.CreateDisposition.CREATE_IF_NEEDED)
job.begin()

# Wait for the job to complete.
while True:
    job.reload()
    if job.state == 'DONE':
        if job.error_result:
            raise RuntimeError(job.errors)
        return
    time.sleep(1)

최신 버전의 클라이언트 라이브러리:

Python

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


from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set source_table_id to the ID of the original table.
# source_table_id = "your-project.source_dataset.source_table"

# TODO(developer): Set destination_table_id to the ID of the destination table.
# destination_table_id = "your-project.destination_dataset.destination_table"

job = client.copy_table(source_table_id, destination_table_id)
job.result()  # Wait for the job to complete.

print("A copy of the table created.")

자세한 내용은 테이블 복사를 참조하세요.

데이터를 테이블로 스트리밍

다음 샘플은 테이블의 스트리밍 버퍼에 행을 쓰는 방법을 보여줍니다.

이전 버전의 클라이언트 라이브러리:

dataset = client.dataset(dataset_name)
table = dataset.table(table_name)

# Reload the table to get the schema.
table.reload()

rows = [('values', 'in', 'same', 'order', 'as', 'schema')]
errors = table.insert_data(rows)

if not errors:
    print('Loaded 1 row into {}:{}'.format(dataset_name, table_name))
else:
    do_something_with(errors)

최신 버전의 클라이언트 라이브러리:

Python

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

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set table_id to the ID of table to append to.
# table_id = "your-project.your_dataset.your_table"

rows_to_insert = [
    {u"full_name": u"Phred Phlyntstone", u"age": 32},
    {u"full_name": u"Wylma Phlyntstone", u"age": 29},
]

errors = client.insert_rows_json(table_id, rows_to_insert)  # Make an API request.
if errors == []:
    print("New rows have been added.")
else:
    print("Encountered errors while inserting rows: {}".format(errors))

자세한 내용은 데이터를 BigQuery로 스트리밍을 참조하세요.

테이블 나열

다음 샘플은 데이터 세트의 테이블을 나열하는 방법을 보여줍니다.

이전 버전의 클라이언트 라이브러리:

dataset = client.dataset(dataset_name)
for table in dataset.list_tables():
    print(table.name)

최신 버전의 클라이언트 라이브러리:

Python

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


from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set dataset_id to the ID of the dataset that contains
#                  the tables you are listing.
# dataset_id = 'your-project.your_dataset'

tables = client.list_tables(dataset_id)  # Make an API request.

print("Tables contained in '{}':".format(dataset_id))
for table in tables:
    print("{}.{}.{}".format(table.project, table.dataset_id, table.table_id))

자세한 내용은 데이터 세트의 테이블 나열을 참조하세요.

테이블 가져오기

다음 샘플은 테이블을 가져오는 방법을 보여줍니다.

이전 버전의 클라이언트 라이브러리:

dataset = client.dataset(dataset_name)
table = dataset.table(table_name)
table.reload()

최신 버전의 클라이언트 라이브러리:

Python

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


from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set table_id to the ID of the model to fetch.
# table_id = 'your-project.your_dataset.your_table'

table = client.get_table(table_id)  # Make an API request.

# View table properties
print(
    "Got table '{}.{}.{}'.".format(table.project, table.dataset_id, table.table_id)
)
print("Table schema: {}".format(table.schema))
print("Table description: {}".format(table.description))
print("Table has {} rows".format(table.num_rows))

자세한 내용은 테이블 정보 가져오기를 참조하세요.

테이블이 있는지 확인

BigQuery API는 기본 exists 메서드를 제공하지 않습니다. 대신 테이블 리소스를 가져오고 해당 요청으로 인해 404 오류가 발생하는지 확인합니다. 이전에는 클라이언트 라이브러리가 이 검사 수행을 위한 exists() 도우미를 제공했습니다. 하지만 exists() 도우미는 전체 리소스를 가져오기 전에 exists() 호출과 같은 비효율적인 사용 사례를 허용했습니다. 이러한 이유로 exists() 도우미가 클라이언트 라이브러리에서 삭제되었습니다.

다음 샘플은 테이블이 있는지 확인하는 방법을 보여줍니다.

이전 버전의 클라이언트 라이브러리:

dataset = client.dataset(dataset_name)
table = dataset.table(table_name)
if table.exists():
    # do something
else:
    # do something else

최신 버전의 클라이언트 라이브러리:

Python

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

from google.cloud import bigquery
from google.cloud.exceptions import NotFound

client = bigquery.Client()

# TODO(developer): Set table_id to the ID of the table to determine existence.
# table_id = "your-project.your_dataset.your_table"

try:
    client.get_table(table_id)  # Make an API request.
    print("Table {} already exists.".format(table_id))
except NotFound:
    print("Table {} is not found.".format(table_id))

테이블 만들기

다음 샘플은 테이블을 만드는 방법을 보여줍니다.

이전 버전의 클라이언트 라이브러리:

dataset = client.dataset(dataset_name)
table = dataset.table(table_name)
table.create()

최신 버전의 클라이언트 라이브러리:

Python

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

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set table_id to the ID of the table to create.
# table_id = "your-project.your_dataset.your_table_name"

schema = [
    bigquery.SchemaField("full_name", "STRING", mode="REQUIRED"),
    bigquery.SchemaField("age", "INTEGER", mode="REQUIRED"),
]

table = bigquery.Table(table_id, schema=schema)
table = client.create_table(table)  # Make an API request.
print(
    "Created table {}.{}.{}".format(table.project, table.dataset_id, table.table_id)
)

자세한 내용은 테이블 만들기를 참조하세요.

테이블 업데이트

다음 샘플은 테이블을 업데이트하는 방법을 보여줍니다.

이전 버전의 클라이언트 라이브러리:

dataset = client.dataset(dataset_name)
table = dataset.table(table_name)
table.patch(description='new description')

이전 버전의 라이브러리는 etag 속성을 사용하여 테이블 ​​리소스 버전을 확인하지 않으므로, 읽기-수정-쓰기가 안전하지 않습니다.

최신 버전의 클라이언트 라이브러리:

Python

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

# from google.cloud import bigquery
# client = bigquery.Client()
# project = client.project
# dataset_ref = bigquery.DatasetReference(project, dataset_id)
# table_ref = dataset_ref.table('my_table')
# table = client.get_table(table_ref)  # API request

assert table.description == "Original description."
table.description = "Updated description."

table = client.update_table(table, ["description"])  # API request

assert table.description == "Updated description."

자세한 내용은 테이블 속성 업데이트를 참조하세요.

테이블 삭제

다음 샘플은 테이블을 삭제하는 방법을 보여줍니다.

이전 버전의 클라이언트 라이브러리:

dataset = client.dataset(dataset_name)
table = dataset.table(table_name)
table.delete()

최신 버전의 클라이언트 라이브러리:

Python

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


from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set table_id to the ID of the table to fetch.
# table_id = 'your-project.your_dataset.your_table'

# If the table does not exist, delete_table raises
# google.api_core.exceptions.NotFound unless not_found_ok is True.
client.delete_table(table_id, not_found_ok=True)  # Make an API request.
print("Deleted table '{}'.".format(table_id))

자세한 내용은 테이블 삭제를 참조하세요.

데이터 세트 코드 변경

데이터 세트 참조

속성을 추가하지 않고 데이터 세트를 참조하려면 DatasetReference 객체를 사용하고, 전체 데이터 세트 리소스를 참조하려면 Dataset를 사용합니다. 이전에 Dataset 클래스를 사용했던 일부 메서드가 v0.28 및 이후 버전에서는 DatasetReference 클래스를 사용합니다. 예를 들면 다음과 같습니다.

  • 이제 client.dataset('mydataset')DatasetReference를 반환합니다.

DatasetReference 클래스와 Dataset 클래스를 모두 사용하는 예시는 데이터 세트를 만드는 방법을 참조하세요.

데이터 세트 나열

다음 샘플은 Google Cloud 프로젝트의 데이터 세트 나열 방법을 보여줍니다.

이전 버전의 클라이언트 라이브러리:

for dataset in client.list_datasets():
    print(dataset.name)

최신 버전의 클라이언트 라이브러리:

Python

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


from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

datasets = list(client.list_datasets())  # Make an API request.
project = client.project

if datasets:
    print("Datasets in project {}:".format(project))
    for dataset in datasets:
        print("\t{}".format(dataset.dataset_id))
else:
    print("{} project does not contain any datasets.".format(project))

자세한 내용은 데이터 세트 나열을 참조하세요.

데이터 세트 가져오기

다음은 데이터 세트를 가져오는 방법을 보여줍니다.

이전 버전의 클라이언트 라이브러리:

dataset = client.dataset(dataset_name)
dataset.reload()

최신 버전의 클라이언트 라이브러리:

Python

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


from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set dataset_id to the ID of the dataset to fetch.
# dataset_id = 'your-project.your_dataset'

dataset = client.get_dataset(dataset_id)  # Make an API request.

full_dataset_id = "{}.{}".format(dataset.project, dataset.dataset_id)
friendly_name = dataset.friendly_name
print(
    "Got dataset '{}' with friendly_name '{}'.".format(
        full_dataset_id, friendly_name
    )
)

# View dataset properties.
print("Description: {}".format(dataset.description))
print("Labels:")
labels = dataset.labels
if labels:
    for label, value in labels.items():
        print("\t{}: {}".format(label, value))
else:
    print("\tDataset has no labels defined.")

# View tables in dataset.
print("Tables:")
tables = list(client.list_tables(dataset))  # Make an API request(s).
if tables:
    for table in tables:
        print("\t{}".format(table.table_id))
else:
    print("\tThis dataset does not contain any tables.")

자세한 내용은 데이터 세트 정보 가져오기를 참조하세요.

데이터 세트가 있는지 확인

BigQuery API는 기본 exists 메서드를 제공하지 않습니다. 대신 데이터 세트 리소스를 가져오고 이 요청으로 인해 404 오류가 발생하는지 확인합니다. 이전에는 클라이언트 라이브러리가 이 검사 수행을 위한 exists() 도우미를 제공했습니다. 하지만 exists() 도우미는 전체 리소스를 가져오기 전에 exists() 호출과 같은 비효율적인 사용 사례를 허용했습니다. 이러한 이유로 exists() 도우미가 클라이언트 라이브러리에서 삭제되었습니다.

다음 샘플에서는 데이터 세트 유무를 확인하는 방법을 보여줍니다.

이전 버전의 클라이언트 라이브러리:

dataset = client.dataset(dataset_name)
if dataset.exists():
    # do something
else:
    # do something else

최신 버전의 클라이언트 라이브러리:

Python

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

from google.cloud import bigquery
from google.cloud.exceptions import NotFound

client = bigquery.Client()

# TODO(developer): Set dataset_id to the ID of the dataset to determine existence.
# dataset_id = "your-project.your_dataset"

try:
    client.get_dataset(dataset_id)  # Make an API request.
    print("Dataset {} already exists".format(dataset_id))
except NotFound:
    print("Dataset {} is not found".format(dataset_id))

데이터 세트 생성

다음 샘플은 데이터 세트를 만드는 방법을 보여줍니다.

이전 버전의 클라이언트 라이브러리:

dataset = client.dataset(dataset_name)
dataset.create()

최신 버전의 클라이언트 라이브러리:

Python

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

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set dataset_id to the ID of the dataset to create.
# dataset_id = "{}.your_dataset".format(client.project)

# Construct a full Dataset object to send to the API.
dataset = bigquery.Dataset(dataset_id)

# TODO(developer): Specify the geographic location where the dataset should reside.
dataset.location = "US"

# Send the dataset to the API for creation, with an explicit timeout.
# Raises google.api_core.exceptions.Conflict if the Dataset already
# exists within the project.
dataset = client.create_dataset(dataset, timeout=30)  # Make an API request.
print("Created dataset {}.{}".format(client.project, dataset.dataset_id))

자세한 내용은 데이터 세트 만들기를 참조하세요.

데이터 세트 업데이트

다음 샘플은 데이터 세트를 업데이트하는 방법을 보여줍니다.

이전 버전의 클라이언트 라이브러리:

dataset = client.dataset(dataset_name)
dataset.patch(description='new description')

이전 버전의 라이브러리는 etag 속성을 사용하여 데이터 세트 ​​리소스 버전을 확인하지 않으므로, 읽기-수정-쓰기가 안전하지 않습니다.

최신 버전의 클라이언트 라이브러리:

Python

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


from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set dataset_id to the ID of the dataset to fetch.
# dataset_id = 'your-project.your_dataset'

dataset = client.get_dataset(dataset_id)  # Make an API request.
dataset.description = "Updated description."
dataset = client.update_dataset(dataset, ["description"])  # Make an API request.

full_dataset_id = "{}.{}".format(dataset.project, dataset.dataset_id)
print(
    "Updated dataset '{}' with description '{}'.".format(
        full_dataset_id, dataset.description
    )
)

자세한 내용은 데이터 세트 속성 업데이트를 참조하세요.

데이터 세트 삭제

다음 샘플에서는 데이터 세트를 삭제하는 방법을 보여줍니다.

이전 버전의 클라이언트 라이브러리:

dataset = client.dataset(dataset_name)
dataset.delete()

최신 버전의 클라이언트 라이브러리:

Python

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


from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set model_id to the ID of the model to fetch.
# dataset_id = 'your-project.your_dataset'

# Use the delete_contents parameter to delete a dataset and its contents.
# Use the not_found_ok parameter to not receive an error if the dataset has already been deleted.
client.delete_dataset(
    dataset_id, delete_contents=True, not_found_ok=True
)  # Make an API request.

print("Deleted dataset '{}'.".format(dataset_id))

자세한 내용은 데이터 세트 삭제를 참조하세요.