Ch03_bigquery_with_python

Page content

1. 구글 클라우드 설정

본격적인 빅쿼리 실습에 앞서서, Python과 연동하는 예제를 준비하였다. 빅쿼리 시작에 앞서서 선행적으로 클라우드 사용을 해야 한다.

  1. 만약 GCP 프로젝트가 없다면, 계정을 연동한다. Go to Cloud Resource Manager
  2. 그리고, 비용결제를 위한 카드를 등록한다. Enable billing
  3. 마지막으로 BigQuery API를 사용해야 하기 때문에 빅쿼리 API 사용허가를 내준다.Enable BigQuery

위 API를 이용하지 않으면 Python 또는 R과 연동해서 사용할 수는 없다. 자주 쓰는것이 아니라면 비용은 거의 발생하지 않으니 염려하지 않아도 된다. 비용관리에 대한 자세한 내용은 BigQuery 권장사항: 비용 관리에서 확인하기를 바란다.

2. 사용자 계정 인증

구글 코랩을 사용해서 인증 절차를 밟도록 한다. 아래 소스코드는 변경시키지 않는다. 아래 절차대로 진행하면 된다. Gmail 인증 절차와 비슷하다.

from google.colab import auth
auth.authenticate_user()
print('Authenticated')
Authenticated

3. 매직(magics)을 활용한 BigQuery 연동

아래 %% 코드를 활용하면 빅쿼리를 이제 Jupyter Notebook에서 사용할 수 있다. 이제 강사가 보여주는 모든 코드는 빅쿼리 GUI에서 확인하는 것이 아닌 Jupyter Notebook에서 사용할 것이다.

%%bigquery --project yourprojectid
SELECT 
  COUNT(*) as total_rows
FROM `bigquery-public-data.samples.gsod`
%%bigquery --project yourprojectid
SELECT
  COUNT(*) as total_rows
FROM `bigquery-public-data.samples.gsod`
|    | total_rows    |
|---:|:--------|
|  0 | 114420316   |

4. BigQuery를 SQL처럼 연동하기 (google.cloud 모듈 활용)

연동 방법에 관한 자세한 내용은 BigQuery 공식 문서를 활용해보자. See BigQuery documentation and library reference documentation.

project_id = 'yourprojectid'
from google.cloud import bigquery
from tabulate import tabulate

client = bigquery.Client(project=project_id)

sample_count = 2000
row_count = client.query('''
  SELECT 
    COUNT(*) as total
  FROM `bigquery-public-data.samples.gsod`''').to_dataframe().total[0]

df = client.query('''
  SELECT
    *
  FROM
    `bigquery-public-data.samples.gsod`
  WHERE RAND() < %d/%d
''' % (sample_count, row_count)).to_dataframe()

print('Full dataset has %d rows' % row_count)
Full dataset has 114420316 rows
print(tabulate(df.describe(), tablefmt="pipe", headers="keys"))
|       |   station_number |   wban_number |      year |      month |        day |   mean_temp |   num_mean_temp_samples |   mean_dew_point |   num_mean_dew_point_samples |   mean_sealevel_pressure |   num_mean_sealevel_pressure_samples |   mean_station_pressure |   num_mean_station_pressure_samples |   mean_visibility |   num_mean_visibility_samples |   mean_wind_speed |   num_mean_wind_speed_samples |   max_sustained_wind_speed |   max_gust_wind_speed |   max_temperature |   total_precipitation |   snow_depth |
|:------|-----------------:|--------------:|----------:|-----------:|-----------:|------------:|------------------------:|-----------------:|-----------------------------:|-------------------------:|-------------------------------------:|------------------------:|------------------------------------:|------------------:|------------------------------:|------------------:|------------------------------:|---------------------------:|----------------------:|------------------:|----------------------:|-------------:|
| count |             2051 |        2051   | 2051      | 2051       | 2051       |   2051      |              2051       |        1974      |                   1974       |               1567       |                           1567       |                784      |                           784       |        1841       |                     1841      |        2031       |                    2031       |                 1989       |             264       |         2050      |          1871         |    101       |
| mean  |           508359 |       91316.6 | 1986.89   |    6.44369 |   15.7596  |     52.5195 |                12.8674  |          41.9928 |                     12.773   |               1015.21    |                             10.9445  |                966.766  |                            11.5064  |          12.2796  |                       12.4829 |           6.67001 |                      12.8552  |                   12.1624  |              25.583   |           43.9789 |             0.0765099 |      8.8505  |
| std   |           294807 |       24990.5 |   16.5317 |    3.47607 |    8.81497 |     23.699  |                 7.90362 |          22.3136 |                      7.92298 |                  9.14934 |                              7.35291 |                 66.8671 |                             7.64138 |           9.55667 |                        7.7892 |           4.79217 |                       7.89036 |                    6.80985 |               8.43217 |           23.6315 |             0.324789  |      9.63454 |
| min   |            10010 |          73   | 1931      |    1       |    1       |    -72.3    |                 4       |         -60.7    |                      4       |                972.8     |                              4       |                637.1    |                             4       |           0       |                        4      |           0       |                       4       |                    1       |               9.7     |          -78.2    |             0         |      0.4     |
| 25%   |           249705 |       99999   | 1976      |    3       |    8       |     39.15   |                 7       |          30.3    |                      7       |               1009.9     |                              6       |                949.35   |                             6       |           6.3     |                        6      |           3.3     |                       7       |                    7.8     |              19.4     |           32      |             0         |      1.6     |
| 50%   |           541720 |       99999   | 1989      |    6       |   16       |     55.2    |                 8       |          44.35   |                      8       |               1014.9     |                              8       |                992.8    |                             8       |           9.8     |                        8      |           5.6     |                       8       |                   11.1     |              23.9     |           46.4    |             0         |      5.9     |
| 75%   |           724574 |       99999   | 2000      |    9       |   23       |     70.6    |                23       |          57.1    |                     23       |               1020.65    |                             16       |               1009.2    |                            20.25    |          14.9     |                       23      |           8.9     |                      23       |                   15.5     |              29.9     |           61      |             0.02      |     13.8     |
| max   |           999999 |       99999   | 2010      |   12       |   31       |     99.2    |                24       |          79.8    |                     24       |               1053       |                             24       |               1038.5    |                            24       |          99.4     |                       24      |          50.4     |                      24       |                   69.9     |              56.3     |           90      |             7.87      |     58.7     |

여기에서 흥미로운 것이 있다면, BigQuery에서 불러온 데이터와 pandas 문법 연동이 가능하다는 것이다. 위 소스코드를 천천히 읽어보기를 권한다.

5. pandas-gbq 모듈을 활용한 BigQuery 사용

Pandas gbq 라이브러리는 pandas 공동체가 주도하는 프로젝트다. DataFrame을 BigQuery에 쓰고 쿼리를 실행하는 것과 같은 기본적인 기능을 다룬다. 자세한 건, 모듈의 공식문서를 확인해본다. Pandas GBQ Documentation

import pandas as pd

sample_count = 2000
df = pd.io.gbq.read_gbq('''
  SELECT name, SUM(number) as count
  FROM `bigquery-public-data.usa_names.usa_1910_2013`
  WHERE state = 'TX'
  GROUP BY name
  ORDER BY count DESC
  LIMIT 100
''', project_id=project_id, dialect='standard')

print(tabulate(df.head(), tablefmt="pipe", headers="keys"))
|    | name    |   count |
|---:|:--------|--------:|
|  0 | James   |  272793 |
|  1 | John    |  235139 |
|  2 | Michael |  225320 |
|  3 | Robert  |  220399 |
|  4 | David   |  219028 |

이 글을 읽음으로써, 이제 매우 쉽게 빅쿼리와 연동해서 사용할 수 있게 되었다. 다음에는 R과 연동해서 사용하는 방법에 대해 익히도록 한다.

6. Reference

“Getting Started with BigQuery.” Google, Google, colab.research.google.com/notebooks/bigquery.ipynb.