# 파이썬에서 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
)
)