שימוש ב-BigQuery עם Python

1. סקירה כללית

BigQuery הוא מחסן נתונים לצורכי ניתוח מנוהל במלואו של Google, בקנה מידה של פטה-בייט ובעלות נמוכה. ‫BigQuery הוא NoOps – אין תשתית לניהול ולא צריך מנהל מסד נתונים – כך שאתם יכולים להתמקד בניתוח נתונים כדי למצוא תובנות משמעותיות, להשתמש ב-SQL מוכר ולנצל את היתרונות של המודל שלנו של תשלום לפי שימוש.

ב-codelab הזה תשתמשו בספריות לקוח של Google Cloud ל-Python כדי לשלוח שאילתות למערכי נתונים ציבוריים של BigQuery באמצעות Python.

מה תלמדו

  • איך משתמשים ב-Cloud Shell?
  • איך מפעילים את BigQuery API
  • איך מאמתים בקשות API
  • איך מתקינים את ספריית הלקוח של Python
  • איך שולחים שאילתות לגבי יצירות של שייקספיר
  • איך מריצים שאילתות בקבוצת הנתונים של GitHub
  • איך משנים את הגדרות השמירה במטמון ואת הנתונים הסטטיסטיים שמוצגים

מה תצטרכו

  • פרויקט ב-Google Cloud
  • דפדפן, כמו Chrome או Firefox
  • היכרות עם השימוש ב-Python

סקר

איך תשתמשו במדריך הזה?

רק לקרוא לקרוא ולבצע את התרגילים

איך היית מדרג את חוויית השימוש שלך ב-Python?

מתחילים ביניים מומחים

איזה דירוג מתאים לדעתך לחוויית השימוש שלך בשירותי Google Cloud?

מתחילים ביניים מומחים

2. הגדרה ודרישות

הגדרת סביבה בקצב אישי

  1. נכנסים ל-מסוף Google Cloud ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או Google Workspace, אתם צריכים ליצור חשבון.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • שם הפרויקט הוא השם המוצג של הפרויקט הזה למשתתפים. זו מחרוזת של תווים שלא נמצאת בשימוש ב-Google APIs, ואפשר לעדכן אותה בכל שלב.
  • מזהה הפרויקט חייב להיות ייחודי בכל הפרויקטים ב-Google Cloud, והוא קבוע (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר באופן אוטומטי מחרוזת ייחודית. בדרך כלל לא צריך להתייחס אליה. ברוב סדנאות ה-Codelab, צריך להפנות למזהה הפרויקט (ובדרך כלל הוא מזוהה כ-PROJECT_ID), אז אם לא מוצא חן בעיניכם, אפשר ליצור מזהה אקראי אחר, או לנסות מזהה משלכם ולבדוק אם הוא זמין. אחרי שהפרויקט נוצר, הוא 'קפוא'.
  • יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. במאמרי העזרה מפורט מידע נוסף על שלושת הערכים האלה.
  1. בשלב הבא, תצטרכו להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבי Cloud או בממשקי API. העלות של התרגול הזה לא אמורה להיות גבוהה, ואולי אפילו לא תצטרכו לשלם בכלל. כדי לכבות את המשאבים ולא לחייב אתכם מעבר למה שמוסבר במדריך הזה, צריך לפעול לפי ההוראות לניקוי שמופיעות בסוף ה-Codelab. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.

מפעילים את Cloud Shell

אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל ב-codelab הזה תשתמשו ב-Google Cloud Shell, סביבת שורת פקודה שפועלת בענן.

הפעלת Cloud Shell

  1. ב-Cloud Console, לוחצים על Activate Cloud Shell 853e55310c205094.png.

55efc1aaa7a4d3ad.png

אם זו הפעם הראשונה שאתם מפעילים את Cloud Shell, יוצג לכם מסך ביניים (מתחת לקו הקיפול) עם תיאור של הכלי. במקרה כזה, לוחצים על המשך (והמסך הזה לא יוצג לכם יותר). כך נראה המסך החד-פעמי:

9c92662c6a846a5c.png

הקצאת המשאבים והחיבור ל-Cloud Shell נמשכים רק כמה רגעים.

9f0e51b578fecce5.png

המכונה הווירטואלית הזו כוללת את כל הכלים שדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות ברשת. אפשר לבצע את רוב העבודה ב-codelab הזה, אם לא את כולה, באמצעות דפדפן או Chromebook.

אחרי שמתחברים ל-Cloud Shell, אמור להופיע אימות שכבר בוצע ושהפרויקט כבר הוגדר לפי מזהה הפרויקט.

  1. מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שעברתם אימות:
gcloud auth list

פלט הפקודה

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שפקודת gcloud מכירה את הפרויקט:
gcloud config list project

פלט הפקודה

[core]
project = <PROJECT_ID>

אם לא, אפשר להגדיר אותו באמצעות הפקודה הבאה:

gcloud config set project <PROJECT_ID>

פלט הפקודה

Updated property [core/project].

3. הפעלת ה-API

‫BigQuery API אמור להיות מופעל כברירת מחדל בכל פרויקט ב-Google Cloud. כדי לבדוק אם זה נכון, מריצים את הפקודה הבאה ב-Cloud Shell: אתם אמורים להופיע ברשימה של BigQuery:

gcloud services list

האפשרות BigQuery אמורה להופיע ברשימה:

NAME                              TITLE
bigquery.googleapis.com           BigQuery API

...

אם BigQuery API לא מופעל, אפשר להשתמש בפקודה הבאה ב-Cloud Shell כדי להפעיל אותו:

gcloud services enable bigquery.googleapis.com

4. אימות בקשות API

כדי לשלוח בקשות ל-BigQuery API, צריך להשתמש בחשבון שירות. חשבון שירות שייך לפרויקט שלכם, וספריית הלקוח של Google Cloud Python משתמשת בו כדי לשלוח בקשות ל-BigQuery API. בדומה לכל חשבון משתמש אחר, חשבון שירות מיוצג על ידי כתובת אימייל. בקטע הזה נשתמש ב-Cloud SDK כדי ליצור חשבון שירות, ואז ניצור פרטי כניסה שיידרשו לאימות בתור חשבון השירות.

קודם כל, מגדירים את משתנה הסביבה PROJECT_ID:

export PROJECT_ID=$(gcloud config get-value core/project)

לאחר מכן, יוצרים חשבון שירות חדש כדי לגשת אל BigQuery API באמצעות:

gcloud iam service-accounts create my-bigquery-sa \
  --display-name "my bigquery service account"

בשלב הבא, יוצרים פרטי כניסה שקוד Python ישתמש בהם כדי להתחבר בתור חשבון השירות החדש. יוצרים את פרטי הכניסה ושומרים אותם כקובץ JSON‏ ~/key.json באמצעות הפקודה הבאה:

gcloud iam service-accounts keys create ~/key.json \
  --iam-account my-bigquery-sa@${PROJECT_ID}.iam.gserviceaccount.com

לבסוף, מגדירים את משתנה הסביבה GOOGLE_APPLICATION_CREDENTIALS, שספריית הלקוח של BigQuery Python משתמשת בו כדי למצוא את פרטי הכניסה שלכם. צריך להגדיר את משתנה הסביבה לנתיב המלא של קובץ ה-JSON עם פרטי הכניסה שיצרתם, באמצעות הפקודה:

export GOOGLE_APPLICATION_CREDENTIALS=~/key.json

מידע נוסף על אימות BigQuery API

5. הגדרת בקרת גישה

ב-BigQuery נעשה שימוש בניהול זהויות והרשאות גישה (IAM) כדי לנהל את הגישה למשאבים. ל-BigQuery יש מספר תפקידים מוגדרים מראש (משתמש, בעל נתונים, צופה בנתונים וכו') שאפשר להקצות לחשבון השירות שיצרתם בשלב הקודם. מידע נוסף על בקרת גישה זמין במסמכי BigQuery.

כדי לשלוח שאילתות למערכי נתונים ציבוריים, צריך לוודא שלחשבון השירות יש לפחות את התפקיד roles/bigquery.user. ב-Cloud Shell, מריצים את הפקודה הבאה כדי להקצות את תפקיד המשתמש לחשבון השירות:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member "serviceAccount:my-bigquery-sa@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role "roles/bigquery.user"

כדי לוודא שלחשבון השירות יש את תפקיד המשתמש, מריצים את הפקודה הבאה:

gcloud projects get-iam-policy $PROJECT_ID

אתם אמורים לראות את הנתונים הבאים:

bindings:
- members:
  - serviceAccount:my-bigquery-sa@<PROJECT_ID>.iam.gserviceaccount.com
  role: roles/bigquery.user
...

6. התקנת ספריית הלקוח

מתקינים את ספריית הלקוח של BigQuery Python:

pip3 install --user --upgrade google-cloud-bigquery

עכשיו אתם מוכנים לכתוב קוד באמצעות BigQuery API.

7. שליחת שאילתות לגבי יצירות של שייקספיר

מערך נתונים ציבורי הוא כל מערך נתונים שמאוחסן ב-BigQuery וזמין לציבור הרחב. יש עוד הרבה מערכי נתונים ציבוריים שתוכלו להריץ עליהם שאילתות. חלק ממערכי הנתונים מאוחסנים ב-Google, אבל רובם מאוחסנים על ידי צדדים שלישיים. מידע נוסף זמין בדף מערכי נתונים ציבוריים.

בנוסף למערכי נתונים ציבוריים, BigQuery מספק מספר מוגבל של טבלאות לדוגמה שאפשר להריץ עליהן שאילתות. הטבלאות האלה נמצאות במערך הנתונים bigquery-public-data:samples. טבלת shakespeare במערך הנתונים samples מכילה אינדקס מילים של יצירות שייקספיר. הוא מציג את מספר הפעמים שכל מילה מופיעה בכל מאגר.

בשלב הזה תריצו שאילתה על הטבלה shakespeare.

קודם, ב-Cloud Shell, יוצרים אפליקציית Python פשוטה שתשמש להרצת דוגמאות של Translation API.

mkdir bigquery-demo
cd bigquery-demo
touch app.py

פותחים את עורך הקוד בפינה השמאלית העליונה של Cloud Shell:

b648141af44811a3.png

עוברים לקובץ app.py בתוך התיקייה bigquery-demo ומחליפים את הקוד בקוד הבא.

from google.cloud import bigquery

client = bigquery.Client()

query = """
    SELECT corpus AS title, COUNT(word) AS unique_words
    FROM `bigquery-public-data.samples.shakespeare`
    GROUP BY title
    ORDER BY unique_words
    DESC LIMIT 10
"""
results = client.query(query)

for row in results:
    title = row['title']
    unique_words = row['unique_words']
    print(f'{title:<20} | {unique_words}')

כדאי להקדיש דקה או שתיים כדי לבדוק את הקוד ולראות איך מתבצעת השאילתה בטבלה.

חוזרים ל-Cloud Shell ומריצים את האפליקציה:

python3 app.py

אמורה להופיע רשימה של מילים והמופעים שלהן:

hamlet               | 5318
kinghenryv           | 5104
cymbeline            | 4875
troilusandcressida   | 4795
kinglear             | 4784
kingrichardiii       | 4713
2kinghenryvi         | 4683
coriolanus           | 4653
2kinghenryiv         | 4605
antonyandcleopatra   | 4582

8. הרצת שאילתה בקבוצת הנתונים של GitHub

כדי להכיר טוב יותר את BigQuery, נריץ עכשיו שאילתה על מערך הנתונים הציבורי של GitHub. אפשר למצוא את הודעות הקומיט הנפוצות ביותר ב-GitHub. תשתמשו גם במסוף האינטרנט של BigQuery כדי להציג תצוגה מקדימה של שאילתות אד-הוק ולהריץ אותן.

כדי לראות איך הנתונים נראים, פותחים את מערך הנתונים של GitHub בממשק המשתמש האינטרנטי של BigQuery:

פתיחת הטבלה github_repos

לוחצים על הלחצן 'תצוגה מקדימה' כדי לראות איך הנתונים נראים:

d3f0dc7400fbe678.png

עוברים לקובץ app.py בתוך התיקייה bigquery_demo ומחליפים את הקוד בקוד הבא.

from google.cloud import bigquery

client = bigquery.Client()

query = """
    SELECT subject AS subject, COUNT(*) AS num_duplicates
    FROM bigquery-public-data.github_repos.commits
    GROUP BY subject
    ORDER BY num_duplicates
    DESC LIMIT 10
"""
results = client.query(query)

for row in results:
    subject = row['subject']
    num_duplicates = row['num_duplicates']
    print(f'{subject:<20} | {num_duplicates:>9,}')

כדאי להקדיש דקה או שתיים ללימוד הקוד ולראות איך מתבצעת שאילתה בטבלה כדי למצוא את הודעות הקומיט הנפוצות ביותר.

חוזרים ל-Cloud Shell ומריצים את האפליקציה:

python3 app.py

אמורה להופיע רשימה של הודעות על ביצוע שינויים והמופעים שלהן:

Update README.md     | 1,685,515
Initial commit       | 1,577,543
update               |   211,017
                     |   155,280
Create README.md     |   153,711
Add files via upload |   152,354
initial commit       |   145,224
first commit         |   110,314
Update index.html    |    91,893
Update README        |    88,862

9. שמירה במטמון ונתונים סטטיסטיים

מערכת BigQuery שומרת במטמון את תוצאות השאילתות. כתוצאה מכך, השאילתות הבאות ייקחו פחות זמן. אפשר להשבית את השמירה במטמון באמצעות אפשרויות שאילתה. בנוסף, ב-BigQuery מתבצע מעקב אחרי נתונים סטטיסטיים לגבי שאילתות, כמו זמן היצירה, זמן הסיום והמספר הכולל של בייטים שעברו עיבוד.

בשלב הזה, משביתים את השמירה במטמון ומציגים נתונים סטטיסטיים לגבי השאילתות.

עוברים לקובץ app.py בתוך התיקייה bigquery_demo ומחליפים את הקוד בקוד הבא.

from google.cloud import bigquery

client = bigquery.Client()

query = """
    SELECT subject AS subject, COUNT(*) AS num_duplicates
    FROM bigquery-public-data.github_repos.commits
    GROUP BY subject
    ORDER BY num_duplicates
    DESC LIMIT 10
"""
job_config = bigquery.job.QueryJobConfig(use_query_cache=False)
results = client.query(query, job_config=job_config)

for row in results:
    subject = row['subject']
    num_duplicates = row['num_duplicates']
    print(f'{subject:<20} | {num_duplicates:>9,}')

print('-'*60)
print(f'Created: {results.created}')
print(f'Ended:   {results.ended}')
print(f'Bytes:   {results.total_bytes_processed:,}')

כמה דברים שכדאי לשים לב אליהם בקוד. קודם כול, ההטמעה של QueryJobConfig וההגדרה של use_query_cache כ-false משביתות את השמירה במטמון. שנית, ניגשתם לנתונים הסטטיסטיים לגבי השאילתה מאובייקט המשרה.

חוזרים ל-Cloud Shell ומריצים את האפליקציה:

python3 app.py

כמו קודם, תופיע רשימה של הודעות על ביצוע שינויים והמופעים שלהן. בנוסף, בסוף השאילתה אמורים להופיע נתונים סטטיסטיים לגביה:

Update README.md     | 1,685,515
Initial commit       | 1,577,543
update               |   211,017
                     |   155,280
Create README.md     |   153,711
Add files via upload |   152,354
initial commit       |   145,224
first commit         |   110,314
Update index.html    |    91,893
Update README        |    88,862
------------------------------------------------------------
Created: 2020-04-03 13:30:08.801000+00:00
Ended:   2020-04-03 13:30:15.334000+00:00
Bytes:   2,868,251,894

10. טעינת נתונים לתוך BigQuery

אם רוצים להריץ שאילתות על נתונים משלכם, צריך לטעון את הנתונים ל-BigQuery. ‫BigQuery תומך בטעינת נתונים ממקורות רבים, כולל Cloud Storage, שירותים אחרים של Google ומקורות אחרים שניתן לקרוא מהם. אפשר אפילו להזרים את הנתונים באמצעות הוספות של נתונים בהזרמה. מידע נוסף זמין בדף טעינת נתונים לתוך BigQuery.

בשלב הזה, תטענו קובץ JSON שמאוחסן ב-Cloud Storage לטבלה ב-BigQuery. קובץ ה-JSON נמצא במיקום gs://cloud-samples-data/bigquery/us-states/us-states.json

אם אתם רוצים לדעת מה התוכן של קובץ ה-JSON, אתם יכולים להשתמש בכלי gsutil של שורת הפקודה כדי להוריד אותו ב-Cloud Shell:

gsutil cp gs://cloud-samples-data/bigquery/us-states/us-states.json .

אפשר לראות שהוא מכיל את רשימת המדינות בארה"ב, וכל מדינה היא מסמך JSON בשורה נפרדת:

head us-states.json
{"name": "Alabama", "post_abbr": "AL"}
{"name": "Alaska", "post_abbr":  "AK"}
...

כדי לטעון את קובץ ה-JSON הזה ל-BigQuery, עוברים לקובץ app.py בתיקייה bigquery_demo ומחליפים את הקוד בקוד הבא.

from google.cloud import bigquery

client = bigquery.Client()

gcs_uri = 'gs://cloud-samples-data/bigquery/us-states/us-states.json'

dataset = client.create_dataset('us_states_dataset')
table = dataset.table('us_states_table')

job_config = bigquery.job.LoadJobConfig()
job_config.schema = [
    bigquery.SchemaField('name', 'STRING'),
    bigquery.SchemaField('post_abbr', 'STRING'),
]
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON

load_job = client.load_table_from_uri(gcs_uri, table, job_config=job_config)

print('JSON file loaded to BigQuery')

כדאי להקדיש דקה או שתיים כדי להבין איך הקוד טוען את קובץ ה-JSON ויוצר טבלה עם סכימה מתחת למערך נתונים.

חוזרים ל-Cloud Shell ומריצים את האפליקציה:

python3 app.py

מערך נתונים וטבלה נוצרים ב-BigQuery.

כדי לוודא שמערך הנתונים נוצר, עוברים אל מסוף BigQuery. יוצגו לכם מערך נתונים וטבלה חדשים. כדי לראות את הנתונים, עוברים לכרטיסיית התצוגה המקדימה של הטבלה:

8c7d2621820a5ac4.png

‫11. מעולה!

למדתם איך להשתמש ב-BigQuery עם Python.

פינוי נפח

כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה:

  • במסוף Cloud, נכנסים לדף Manage resources.
  • ברשימת הפרויקטים, בוחרים את הפרויקט ולוחצים על מחיקה.
  • כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

מידע נוסף

רישיון

עבודה זו מורשית תחת רישיון Creative Commons שמותנה בייחוס 2.0 כללי.