# 파이썬에서 BigQuery 사용하기

  • pandas_gbq를 사용해 Pandas Dataframe을 사용할 수 있습니다
  • BigQuery 공식 문서 (opens new window)엔 google-cloud-bigquery가 Google에서 관리하는 오픈소스 라이브러리라고 합니다. 사용하려는 기능이 어디에 있는지를 파악하고 선택하곤 합니다.
    • 일반적으론 pandas_gbq가 사용하기 쉬워 처음 접할 때는 pandas_gbq를 추천하곤 합니다
    • pandas_gbq는 파티션 테이블을 지원하지 않아서, 이슈 (opens new window) 사용하기에 따라 어려울 수 있음

# pandas_gbq

# pandas_gbq : Load Table

  • 데이터 불러오기
import pandas

sql = """
    SELECT name
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state = 'TX'
    LIMIT 100
"""

# Run a Standard SQL query using the environment's default project
df = pandas.read_gbq(sql, dialect="standard")

# Run a Standard SQL query with the project set explicitly
project_id = "your-project-id"
df = pandas.read_gbq(sql, project_id=project_id, dialect="standard")
  • 만약 큰 데이터라고 하면 read_gbq 옵션의 use_bqstorage_api=True를 지정하면 속도가 15~30배 개선

# pandas_gbq : Write Table

  • Dataframe을 BigQuery Table로 보내고 싶은 경우
    • 인자로 if_exists
import pandas

df = pandas.DataFrame(
    {
        "my_string": ["a", "b", "c"],
        "my_int64": [1, 2, 3],
        "my_float64": [4.0, 5.0, 6.0],
        "my_bool1": [True, False, True],
        "my_bool2": [False, True, False],
        "my_dates": pandas.date_range("now", periods=3),
    }
)

PROJECT_ID="my_proejct_id"
table_id = "my_dataset.new_table"

pandas.gbq.to_gbq(df, table_id, PROJECT_ID)

# google-cloud-bigquery

# Load Table

from google.cloud import bigquery

client = bigquery.Client()
sql = """
    SELECT name
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state = 'TX'
    LIMIT 100
"""

# Run a Standard SQL query using the environment's default project
df = client.query(sql).to_dataframe()

# Run a Standard SQL query with the project set explicitly
project_id = "your-project-id"
df = client.query(sql, project=project_id).to_dataframe()

# Write Table with Partition

from google.cloud import bigquery
client = bigquery.Client()
project = client.project
dataset_ref = bigquery.DatasetReference(project, 'my_dataset')

table_ref = dataset_ref.table("my_partitioned_table")
schema = [
    bigquery.SchemaField("name", "STRING"),
    bigquery.SchemaField("post_abbr", "STRING"),
    bigquery.SchemaField("date", "DATE"),
]
table = bigquery.Table(table_ref, schema=schema)
table.time_partitioning = bigquery.TimePartitioning(
    type_=bigquery.TimePartitioningType.DAY,
    field="date"  # name of column to use for partitioning
)  # 90 days

table = client.create_table(table)

print(
    "Created table {}, partitioned on column {}".format(
        table.table_id, table.time_partitioning.field
    )
)