Google Colab에서 BigQuery를 사용할 때 자주 사용하는 코드 스니펫

전제: 인증


from google.colab import auth
auth.authenticate_user()

Colab에서 BigQuery를 사용하려면 먼저 인증을해야합니다.



짧은 코드이므로 일부러 기억할 정도는 아니지만, 코드 스니펫이 준비되어 있으므로 그것을 사용하면 빠르게 추가할 수 있다.

쿼리 결과를 DataFrame에 저장


google.cloud.bigqueryMagic 명령 을 사용하면 한 번에 쿼리 결과를 Pandas DataFrame으로 얻을 수 있습니다.
%%bigquery df --project myproject
SELECT * FROM `myproject.foo.logs`

Magic 명령의 인수로 지정한 이름으로 DataFrame이 만들어져 Python측에서 참조할 수 있게 되어 있다.
df.head(5)

그냥 내용을 확인하고 싶을 때



단지 내용을 확인하고 싶을 때는, 저장처의 DataFrame를 미지정으로 한다.
%%bigquery --project myproject
SELECT * FROM `myproject.foo.logs`

또, 그 때에 %load_ext google.colab.data_table (을)를 실행해 두면, 출력 결과에 대해서 필터링 페이징을 할 수 있게 되어 편리.

매개변수 전달



Parameterized Query 의 기능을 사용해, 쿼리에 파라미터를 건네줄 수가 있다.
%%bigquery --project myproject df --params {"user_id": 123}
SELECT * FROM `myproject.foo.logs` WHERE user_id = @user_id

파라미터는 --params 인수에 사전형으로 건네준다. 건네받은 파라미터는 @파라미터명으로 참조할 수 있다. 테이블명의 개소에는 파라미터는 사용할 수 없기 때문에 주의. 또한 params는 명령 끝에 지정하지 않으면 오류가 발생하기 때문에주의하십시오.

파라미터에는 배열을 건네줄 수도 있다.
%%bigquery --project myproject df --params {"user_id": [1, 2, 3]}
SELECT * FROM `myproject.foo.logs` WHERE user_id in UNNEST(@user_id)

변수를 전달하려는 경우
params = {"user_id": [1, 2, 3]}
%%bigquery --project myproject df --params $params
SELECT * FROM `myproject.foo.logs` WHERE user_id in UNNEST(@user_id)

결과를 CSV로 저장


import os
df.to_csv(os.path.join("output.csv"), index=False)

취득한 DataFrame은 to_csv 로 CSV 파일에 쓸 수 있다. Google Drive를 마운트해 두면, Google Drive상에 내보낼 수 있어 편리.
from pathlib import Path
Path(out_dir).mkdir(parents=True, exist_ok=True)

출력처의 디렉토리를 준비하고 싶을 때는 pathlibPath.mkdir 가 편리. parents=True를 설정하여 중간 디렉토리를 함께 만들거나 exist_ok=True를 설정하면 이미 디렉토리가 있더라도 오류가 발생하지 않고 처리를 계속할 수 있습니다.

쿼리 결과에서 테이블 만들기



분석의 내용에 따라서는 중간 테이블을 만들어 계산량을 절약하거나 중간 결과의 가시화/체크를 할 수 있어 효율을 개선할 수 있다.

최신 google-cloud-bigquery 에서는 --destination_table 옵션을 사용할 수 없기 때문에 Magic 명령을 사용하지 않고 작업을 만드는 코드를 작성합니다.
from google.cloud import bigquery

client = bigquery.Client(project="myproject")
table_id = "myproject.foo.purchase_logs"

job_config = bigquery.QueryJobConfig(destination=table_id)

sql = r'''
    SELECT transaction_id, user_id, transaction_date, product_id
    FROM `myproject.foo.transactions`
    WHERE action = "purchase"
'''

query_job = client.query(sql, job_config=job_config)
query_job.result()

공식 문서 : htps : // c ぉ d. 오, ぇ. 이 m/비g 쿠에 ry/도 cs/w 리친 g-레스 lts? hl = 그럼

덧붙여 쿼리내에서 google-cloud-bigquery 등 Scripting을 사용하고 있는 경우는, BigQuery의 제약상 실행 결과를 테이블에 보존할 수 없기 때문에 주의.
htps : // c ぉ d. 오, ぇ. 코 m / 비g 쿠에 ry / 도 cs / 레후 렌세 / s 단지 rdsql / sc 리 p 친g
h tps : // s t c ゔ ぇ rf ぉ w. 코 m / 쿠에 s 치온 s / 58646725 / 칸 오 t 세 t에서 s 치나 치 온 - b ぇ - ぃ th - g 쿠에 ry py 텐 - 아피

참고: Notebook에서 사용할 수 있는 google-cloud-bigquery 패키지 버전을 확인하는 방법


!pip show google-cloud-bigquery

버전 DECLARE 이후라면, 1.22.0 를 사용할 수 있다.

테이블이 존재할 때 덮어쓰기



QueryJobConfigWriteDisposition 에서 --destination_table 를 지정하면, 이미 테이블이 존재했을 경우에 내용을 파기한 후에 재작성할 수 있다. (원래 테이블의 데이터는 파기되므로 주의)
job_config = bigquery.QueryJobConfig(destination=table_id, write_disposition=bigquery.WriteDisposition.WRITE_TRUNCATE)
WRITE_TRUNCATE를 지정하면 기존 테이블에 추가 데이터가 추가됩니다.

CSV 파일 내용에서 테이블 만들기



CSV 파일에서 테이블을 만들려면 WRITE_APPEND 명령의 bg load을 사용하여 업로드하십시오.
!bq load --project_id=myproject --autodetect --source_format=CSV myproject:foo.products sample.csv

지정하는 파라미터의 내용은 판독하는 CSV의 내용에 따라 적절하게 변경된다.
bq 를 지정하면(자), 벌써 테이블이 있었을 경우에 그 내용을 파기한 후에, 재작성할 수 있다.

기타



쿼리 생성을 위한 메소드를 heredoc로 작성


def build_some_query(user_id, product_id):
  return f'''
SELECT time, user_id, product_id, price FROM some_table WHERE user_id = {user_id} AND product_id = {product_id}
'''

참고


  • htps : // 코 b. 레세아 rch. 오, ぇ. 이 m/노테보오 ks/비g 쿠에 ry. 이 pyn b
  • htps : // c ぉ d. 오, ぇ. 이 m/비g 쿠에 ry/도 cs/w 리친 g-레스 lts? hl = 그럼
  • 좋은 웹페이지 즐겨찾기