สถาบันข้อมูลขนาดใหญ่ (องค์การมหาชน)

เชื่อมต่อ BigQuery ด้วย Python ใน 3 ขั้นตอน

Aug 22, 2022

ปัจจุบันโลกของเราหมุนไปอย่างรวดเร็วทำให้เกิดเทคโนโลยีต่าง ๆ ขึ้นมามากมาย ไม่ว่าจะเป็นเทคโนโลยีทางด้านการแพทย์ การขนส่ง การเกษตร การศึกษา หรือแม้กระทั่งนวัตกรรมต่าง ๆ ล้วนหลีกเลี่ยงไม่ได้ที่จะต้องเผชิญกับข้อมูลที่มีขนาดใหญ่มหาศาล โดยเมื่อก่อนนั้นเราอาจจะเคยเก็บข้อมูลขนาดเล็ก หรือขนาดกลางลงในฐานข้อมูลเชิงสัมพันธ์ (Relational Database) เช่น PostgreSQL, MySQL เป็นต้น ซึ่งฐานข้อมูลเหล่านี้สามารถรองรับปริมาณข้อมูล และการประมวลผลได้โดยไม่มีปัญหา

อย่างไรก็ตาม ข้อมูลที่ถูกเก็บสะสมมาเป็นระยะเวลานาน ปริมาณข้อมูลจึงมีขนาดใหญ่โตขึ้นมาก เทคโนโลยีทางด้านข้อมูลจึงจำเป็นต้องถูกพัฒนาควบคู่กันไป เพื่อให้สามารถรองรับข้อมูลจำนวนมหาศาลได้ด้วยเช่นกัน

ด้วยความต้องการนี้เอง บริษัท Google จึงได้พัฒนาเทคโนโลยีที่ชื่อว่า BigQuery ขึ้นมา เพื่อให้บริการทางด้านฐานข้อมูลขนาดใหญ่ โดยเทคโนโลยี BigQuery นี้เป็นบริการตัวหนึ่งของ Google Cloud platform ซึ่งทำหน้าที่เป็นคลังข้อมูล (Data Warehouse) ที่สามารถจัดเก็บข้อมูลขนาดใหญ่ และมีความสามารถในการปรับขนาดได้ (Scalable) ที่สำคัญ คือคุณสมบัติในการประมวลผล และวิเคราะห์ข้อมูลที่มีขนาดใหญ่ โดยผู้ใช้งานสามารถใช้ความรู้พื้นฐาน SQL ในการเรียกข้อมูลได้ นอกจากนี้ยังสามารถเขียน Python Script เชื่อมต่อไปยังฐานข้อมูล BigQuery เพื่อจัดการประมวลผลและวิเคราะห์ข้อมูล โดยอาศัย Python Library อย่างเช่น Pandas ที่เป็นเครื่องมือในการจัดการ, วิเคราะห์ข้อมูลที่มีความยืดหยุ่น และใช้งานง่าย หากท่านทำงานสาย Data Science อยู่แล้ว ทางผู้เขียนขอแนะนำให้ท่านทำความรู้จักกับ Pandas ไว้ได้เลยนะคะ เชื่อว่าจะมีโอกาสได้ใช้ประโยชน์ในอนาคตอย่างแน่นอน โดยบทความนี้จะพาท่านมาทดลองเชื่อมต่อ BigQuery ด้วย Python ง่าย ๆ เพียง 3 ขั้นตอน ดังรูปที่ 1 ไปดูกันเลยดีกว่า ว่าแต่ละขั้นตอนมีรายละเอียดอย่างไรบ้าง

รูปที่ 1 แสดงขั้นตอนการทำงานสำหรับการเขียน Python Script เพื่อเชื่อมต่อไปยังฐานข้อมูล BigQuery

ขั้นตอนที่ 1 กำหนดโครงสร้างของตาราง

ในกรณีที่เราสร้างตารางขึ้นมาใหม่ หรือมีตารางอยู่แล้วในฐานข้อมูล หากเราต้องการเรียกใช้ข้อมูลที่อยู่ในตาราง เราจำเป็นจะต้องทราบว่าโครงสร้างของตารางประกอบไปด้วยคอลัมน์อะไรบ้าง และในแต่ละคอลัมน์นั้นมีความหมายว่าอย่างไร เพื่อให้สามารถเรียกใช้ข้อมูลได้อย่างถูกต้องตรงกับความต้องการ

ขั้นตอนที่ 2 การสร้าง BigQuery Keyfile

คือ ไฟล์กุญแจที่ถูกสร้างขึ้นเพื่อกำหนดสิทธิ์ในการเข้าถึงฐานข้อมูล BigQuery เราจะใช้ Keyfile นี้ ในขั้นตอนที่ 3 ที่เป็นการเขียน Python Script เพื่อเชื่อมต่อไปยังฐานข้อมูลนั่นเอง หากเราไม่มี Keyfile จะไม่สามารถเชื่อมต่อไปยังฐานข้อมูลได้

ขั้นตอนที่ 3 การเขียน Python Script

ในขั้นตอนนี้ เราจำเป็นจะต้องใช้ BigQuery Keyfile ในการเชื่อมต่อฐานข้อมูล ตัวอย่าง Python Script ที่นำเสนอเป็นการเชื่อมต่อไปยังฐานข้อมูลเพื่อดึงข้อมูลที่อยู่ในตารางทดสอบ และมีการแปลงผลลัพธ์ที่ได้จากการดึงข้อมูลให้อยู่ในรูปแบบของ DataFrame โดยใช้ Pandas เพื่อเตรียมพร้อมสำหรับการจัดการและการวิเคราะห์ข้อมูลต่อไป

หลังจากทราบขั้นตอนการทำงานคร่าว ๆ แล้ว เรามาเริ่มทดลองทำจริงพร้อมกันเลยดีกว่า

ขั้นตอนที่ 1 การกำหนดโครงสร้างตารางใน BigQuery

สามารถเข้าถึง BigQuery โดยไปที่ https://console.cloud.google.com และเลือก BigQuery ดังรูปที่ 2

รูปที่ 2 แสดงการเข้าถึงฐานข้อมูล BigQuery

โดยในขั้นตอนนี้ เราจะสร้างตารางที่ชื่อว่า movies เพื่อใช้ทดสอบ ซึ่งตารางนี้จะประกอบไปด้วย 4 คอลัมน์ ดังนี้

1.movie_id คือ รหัสภาพยนตร์ ชนิดข้อมูลเป็นจำนวนเต็ม
2.movie_title คือ ชื่อภาพยนตร์ ชนิดข้อมูลเป็นสตริง
3.production_year คือ ปีที่สร้าง ชนิดข้อมูลเป็นจำนวนเต็ม
4.rating คือ คะแนน ชนิดข้อมูลเป็นทศนิยม

สามารถสร้างตารางโดยใช้คำสั่ง

CREATE TABLE `project-name.dataset_name.movies`  (
    movie_id INT64,
    movie_title STRING,
    production_year INT64,
    rating FLOAT64
);

โครงสร้างข้อมูลของตาราง movies แสดงดังรูปที่ 3

รูปที่ 3 แสดงโครงสร้างข้อมูลตาราง movies

ต่อมาเป็นการเพิ่มข้อมูลรหัสภาพยนตร์ (movie_id) ชื่อภาพยนตร์ (movie_title) ปีที่สร้าง (production_year) และคะแนน (rating) โดยใช้คำสั่ง

INSERT INTO ` project-name.dataset_name.movies `
(movie_id, movie_title, production_year, rating) 
VALUES
(1, 'Star Wars', 1977, 8.6),
(2, 'The Lion King', 1994, 8.5),
(3, 'Gladiator', 2000, 8.5),
(4, 'Alien', 1979, 8.4),
(5, 'WALL E', 2008, 8.4);

ผลลัพธ์ข้อมูลในตาราง movies ดังรูปที่ 4

รูปที่ 4 แสดงรายการข้อมูลในตาราง movies

ขั้นตอนที่ 2 การสร้าง BigQuery Keyfile สำหรับใช้ในการเชื่อมต่อฐานข้อมูล

โดยสามารถสร้าง Keyfile ได้เพียงทำตามขั้นตอน ดังนี้

2.1 ล็อกอินไปยัง https://console.cloud.google.com และเลือกแถบ IAM & Admin จากนั้น เลือก Service Accounts ดังรูปที่ 5

รูปที่ 5 แสดงการเข้าถึงหน้า Service Accounts

2.2 ในหน้า Service Accounts คลิกปุ่ม Create Service Account และกรอกรายละเอียด Service Account Name, Service Account ID, Service Account Description ตามรูปที่ 6 จากนั้นคลิกปุ่ม CREATE AND CONTINUE

รูปที่ 6 แสดงรายละเอียดสำหรับการสร้าง Service Account

2.3 กำหนด Service Account Access โดยเลือก BigQuery และ BigQuery Admin ตามลำดับ จากนั้นคลิกปุ่ม DONE ดังรูปที่ 7

รูปที่ 7 แสดงการกำหนดสิทธิ์สำหรับการเข้าถึง BigQuery

2.4 คลิกเข้าไปในรายการ Service Account ที่เพิ่งสร้างเมื่อสักครู่ โดยเลือกเข้าไปที่แถบเมนู KEYS ที่อยู่ด้านบน จากนั้นกดปุ่ม ADD KEY และเลือก Create new key ดังรูปที่ 8

รูปที่ 8 แสดงการสร้าง BigQuery Keyfile

2.5 เลือกประเภท Key เป็น JSON และกดปุ่ม CREATE จะเริ่มดำเนินการดาวน์โหลด Key file ดังรูปที่ 9 เป็นอันเสร็จสิ้น

รูปที่ 9 แสดงการดาวน์โหลด Keyfile

ขั้นตอนที่ 3 การสร้าง Python Script สำหรับเชื่อมต่อไปยังฐานข้อมูล

เริ่มต้นจากการติดตั้ง Python Library สำหรับเชื่อมต่อไปยัง BigQuery ตามคำสั่งด้านล่าง

pip install --upgrade google-cloud-bigquery

สำหรับตัวอย่าง Script นี้มีการแปลงข้อมูลให้อยู่ในรูปแบบ DataFrame จึงมีการติดตั้ง Pandas DataFrame โดยใช้คำสั่ง

pip install pandas

ตัวอย่าง Script ในการเชื่อมต่อกับฐานข้อมูล BigQuery

from google.oauth2 import service_account
from google.cloud import bigquery
import pandas as pd


# BigQuery config
SCOPES = ['https://www.googleapis.com/auth/bigquery']
SERVICE_ACCOUNT_FILE = 'cred/gbdi-covid-7a8171131681.json'
BQ_PROJECT = 'gbdi-covid'
BQ_DATASET = 'dataset_test'
BQ_TABLE_NAME = 'movies'

credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)

# Construct a BigQuery client object.
client = bigquery.Client(credentials=credentials)

query = """
    SELECT movie_id, movie_title, production_year, rating
    FROM `%s.%s.%s` order by movie_id
""" %(BQ_PROJECT,BQ_DATASET,BQ_TABLE_NAME)
query_job = client.query(query)  # Make an API request.

result = []
for row in query_job:
    result.append({
        'movie_id': format(row[0]),
        'movie_title': format(row[1]),
        'production_year': format(row[2]),
        'rating': format(row[3])
    })

df = pd.DataFrame(result)
print ('dataframe: ',df)

สำหรับการทำงานของ Script ส่วนที่ 1 เป็นการ Import Python Library ที่ใช้ใน Script

from google.oauth2 import service_account
from google.cloud import bigquery
import pandas as pd

ส่วนที่ 2 เป็นการกำหนดการตั้งค่าสำหรับเชื่อมต่อกับ BigQuery โดยตัวแปร SERVICE_ACCOUNT_FILE คือ BigQuery Keyfile ที่ได้ทำการสร้างไว้แล้วในขั้นตอนก่อนหน้า ส่วนตัวแปร BQ_PROJECT, BQ_DATASET, BQ_TABLE_NAME คือ ชื่อโปรเจกต์, ชื่อชุดข้อมูล และชื่อตารางใน BigQuery ตามลำดับ

# BigQuery config
SCOPES = ['https://www.googleapis.com/auth/bigquery']
SERVICE_ACCOUNT_FILE = 'cred/gbdi-covid-7a8171131681.json'
BQ_PROJECT = 'gbdi-covid'
BQ_DATASET = 'dataset_test'
BQ_TABLE_NAME = 'movies'

ส่วนที่ 3 เป็นการสร้างการเชื่อมต่อไปยังฐานข้อมูล

credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)

# Construct a BigQuery client object.
client = bigquery.Client(credentials=credentials)

ส่วนที่ 4 เป็นการส่งคำขอเพื่อดึงข้อมูลในตาราง movies จากฐานข้อมูล และจัดเก็บผลลัพธ์ลงตัวแปร result เพื่อนำไปสร้าง DataFrame ต่อไป

query = """
    SELECT movie_id, movie_title, production_year, rating
    FROM `%s.%s.%s` order by movie_id
""" %(BQ_PROJECT,BQ_DATASET,BQ_TABLE_NAME)
query_job = client.query(query)  # Make an API request.

result = []
for row in query_job:
    result.append({
        'movie_id': format(row[0]),
        'movie_title': format(row[1]),
        'production_year': format(row[2]),
        'rating': format(row[3])
    })

และส่วนที่ 5 ซึ่งเป็นส่วนสุดท้าย เป็นการแปลงผลลัพธ์ที่ได้จากฐานข้อมูล ให้อยู่ในรูปแบบ DataFrame เพื่อให้พร้อมสำหรับการจัดการและวิเคราะห์ข้อมูลต่อไป

df = pd.DataFrame(result)
print ('dataframe: ',df)

ตัวอย่าง ผลลัพธ์ข้อมูลในรูปแบบ DataFrame ที่ได้จากการ Run Script ดังรูปที่ 10

รูปที่ 10 แสดงผลลัพธ์ข้อมูลในรูปแบบ DataFrame

จบไปแล้วนะคะ สำหรับการเชื่อมต่อ BigQuery ด้วย Python ง่าย ๆ เพียงแค่ 3 ขั้นตอน ทำตามได้ไม่ยากเลยใช่ไหมล่ะ ทางผู้เขียนก็หวังว่าบทความนี้จะเป็นประโยชน์สำหรับผู้ที่เริ่มต้นทำงานทางด้านการประมวลผล และวิเคราะห์ข้อมูลผ่าน BigQuery ไม่มากก็น้อย อีกนิดก่อนจากกันผู้เขียนขอแนะนำบทความที่เกี่ยวข้องกับฐานข้อมูลสำหรับผู้ที่สนใจ OLAP และ ฐานข้อมูลประเภทอื่น ๆ เผื่อจะเป็นประโยชน์กับเพื่อน ๆ ที่ทำงานสาย Data ค่ะ สำหรับ BigQuery นั้น ยังมีความสามารถที่ซ่อนอยู่อีกมากมายหลายอย่าง ไว้โอกาสหน้าจะมานำเสนอความสามารถต่าง ๆ เพิ่มเติมให้นะคะ ขอบคุณที่ติดตามอ่านกันมาจนจบค่ะ

เนื้อหาโดย ฐิติรัตน์ บุญช่วยชู
ตรวจทานและปรับปรุงโดย เมธิยาภาวิ์ ศรีมนตรินนท์

Titirat Boonchuaychu

Data Engineer Government Big Data Institute (GBDi)

Methiyapha Srimontrinond

Data Scientist Government Big Data institute (GBDi)