본문 바로가기

AI

[Python Big Data] Google bigquery와 SQL

Bigquery를 이용하면 SQL을 이용하여 큰 데이터셋을 다룰 수 있다

SQL은 데이터베이스 시간에 어느정도 공부를 해서 bigquery를 파이썬에서 pandas와 어떻게 함께 사용하나에 대해 공부해보았다

 

먼저 

 

1
2
import pandas as pd
from google.cloud import bigquery
cs

 

pandas와 bigquery import 해주기!

 

1
2
3
4
5
6
7
8
# Create a "Client" object
client = bigquery.Client()
 
# Construct a reference to the "stackoverflow" dataset
dataset_ref = client.dataset("stackoverflow", project="bigquery-public-data")
 
# API request - fetch the dataset
dataset = client.get_dataset(dataset_ref)
cs

 

client object와 사용하고싶은 데이터의 reference를 가져왔다

클라이언트에서 데이터 레퍼런스를 가져와서 저장하면 dataset이 된다

앞으로 사용할 것은 이 데이터셋이다

 

1
2
3
4
5
# Write the code you need here to figure out the answer
tables = list(client.list_tables(dataset))
 
for table in tables:
    print(table.table_id)
cs

 

데이터셋에 어떤 데이터들이 있는지 먼저살펴보았다

반복문으로 데이터셋 안의 table을 출력시켜준다

 

 

내가 자주 쓰는 stackoverflow 사이트의 데이터셋에는 이러한 테이블들이 들어있었다

가장 기본적인 테이블인 users table을 살펴보았다

 

1
2
3
4
5
# Construct a reference to the "users" table
table_ref = dataset_ref.table("users")
 
# API request - fetch the table
table = client.get_table(table_ref)
cs

 

데이터셋을 가져올때처럼 테이블도 reference를 만들어 가져온다

사용자에 대한 정보가 담긴 테이블은 어떤 스키마를 가지고 있을지 table.schema를 통해 확인해보았다

 

 

이름과 형식 등의 정보를 알 수 있다

 

1
2
# Preview the first five lines of the "full" table
client.list_rows(table, max_results=5).to_dataframe()
cs

 

스키마 뿐만 아니라 list_rows 함수를 통해 저장된 값도 알 수 있다

 

 

이 때 list_rows 함수에 selected_fileds를 지정해주면 보고싶은 feature만 확인할 수 있다

selected_fileds = table.schema[:1] 처럼 사용하면 사용자들의 ID 만 확인 가능하다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
query = """
        SELECT display_name,about_me,age
        FROM `bigquery-public-data.stackoverflow.users`
        WHERE id<100
        """
 
# Set up the query (cancel the query if it would use too much of 
# your quota, with the limit set to 10 GB)
safe_config = bigquery.QueryJobConfig(maximum_bytes_billed=10**10)
query_job = client.query(query, job_config=safe_config)
 
# API request - run the query, and return a pandas DataFrame
results = query_job.to_dataframe()
 
# View top few rows of results
print(results.head())
cs

 

마지막으로 query 날리기!

query는 문자열로 지정해주고 client.query를 통해 결과를 가져올 수 있다

결과를 다섯개만 출력해보면 이렇게 원하는 정보가 나온다

 

 

용량이 너무 커지지 않게 job_config를 설정해주었는데 설정해주지 않고

client.query(query)로 바로 사용 가능하다