استفاده از BigQuery با پایتون

۱. مرور کلی

بیگ‌کوئری، انبار داده تحلیلی کم‌هزینه، کاملاً مدیریت‌شده و در مقیاس پتابایتی گوگل است. بیگ‌کوئری بدون نیاز به عملیات (NoOps) است - هیچ زیرساختی برای مدیریت وجود ندارد و به مدیر پایگاه داده نیاز ندارید - بنابراین می‌توانید بر تجزیه و تحلیل داده‌ها برای یافتن بینش‌های معنادار تمرکز کنید، از SQL آشنا استفاده کنید و از مدل پرداخت به ازای استفاده ما بهره‌مند شوید.

در این آزمایشگاه کد، شما از کتابخانه‌های کلاینت ابری گوگل برای پایتون برای کوئری گرفتن از مجموعه داده‌های عمومی BigQuery با پایتون استفاده خواهید کرد.

آنچه یاد خواهید گرفت

  • نحوه استفاده از ابر پوسته
  • نحوه فعال کردن API بیگ‌کوئری
  • نحوه احراز هویت درخواست‌های API
  • نحوه نصب کتابخانه کلاینت پایتون
  • چگونه آثار شکسپیر را جستجو کنیم
  • نحوه پرس و جو از مجموعه داده GitHub
  • نحوه تنظیم حافظه پنهان و نمایش آمار

آنچه نیاز دارید

  • یک پروژه ابری گوگل
  • یک مرورگر، مانند کروم یا فایرفاکس
  • آشنایی با استفاده از پایتون

نظرسنجی

چگونه از این آموزش استفاده خواهید کرد؟

فقط تا انتها بخوانید آن را بخوانید و تمرین‌ها را انجام دهید

تجربه خود را با پایتون چگونه ارزیابی می‌کنید؟

تازه کار متوسط ماهر

تجربه خود را در استفاده از خدمات ابری گوگل چگونه ارزیابی می‌کنید؟

تازه کار متوسط ماهر

۲. تنظیمات و الزامات

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • نام پروژه ، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود و شما می‌توانید آن را در هر زمانی به‌روزرسانی کنید.
  • شناسه پروژه باید در تمام پروژه‌های گوگل کلود منحصر به فرد باشد و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چیست. در اکثر آزمایشگاه‌های کد، باید به شناسه پروژه ارجاع دهید (و معمولاً با نام PROJECT_ID شناخته می‌شود)، بنابراین اگر آن را دوست ندارید، یک شناسه تصادفی دیگر ایجاد کنید، یا می‌توانید شناسه خودتان را امتحان کنید و ببینید آیا در دسترس است یا خیر. سپس پس از ایجاد پروژه، آن "منجمد" می‌شود.
  • یک مقدار سوم هم وجود دارد، شماره پروژه که برخی از APIها از آن استفاده می‌کنند. برای اطلاعات بیشتر در مورد هر سه این مقادیر به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/APIهای ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد، اگر اصلاً هزینه‌ای نداشته باشد، هزینه زیادی نخواهد داشت. برای خاموش کردن منابع به طوری که پس از این آموزش متحمل پرداخت صورتحساب نشوید، دستورالعمل‌های «پاکسازی» موجود در انتهای آزمایشگاه کد را دنبال کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

شروع پوسته ابری

اگرچه می‌توان از راه دور و از طریق لپ‌تاپ، گوگل کلود را مدیریت کرد، اما در این آزمایشگاه کد، از گوگل کلود شل ، یک محیط خط فرمان که در فضای ابری اجرا می‌شود، استفاده خواهید کرد.

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید 853e55310c205094.png .

55efc1aaa7a4d3ad.png

اگر قبلاً Cloud Shell را شروع نکرده‌اید، یک صفحه میانی (در پایین صفحه) به شما نمایش داده می‌شود که توضیح می‌دهد چیست. در این صورت، روی ادامه کلیک کنید (و دیگر هرگز آن را نخواهید دید). آن صفحه یکبار مصرف به این شکل است:

9c92662c6a846a5c.png

آماده‌سازی و اتصال به Cloud Shell فقط چند لحظه طول می‌کشد.

9f0e51b578fecce5.png

این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز شما پر شده است. این ماشین یک دایرکتوری خانگی ۵ گیگابایتی دائمی ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی بهبود می‌بخشد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان به سادگی با یک مرورگر یا کروم‌بوک انجام داد.

پس از اتصال به 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].

۳. فعال کردن API

رابط برنامه‌نویسی کاربردی BigQuery باید به طور پیش‌فرض در تمام پروژه‌های Google Cloud فعال باشد. می‌توانید با دستور زیر در Cloud Shell بررسی کنید که آیا این موضوع صحت دارد یا خیر: شما باید در فهرست BigQuery قرار بگیرید:

gcloud services list

شما باید BigQuery را در لیست ببینید:

NAME                              TITLE
bigquery.googleapis.com           BigQuery API

...

در صورتی که API مربوط به BigQuery فعال نباشد، می‌توانید از دستور زیر در Cloud Shell برای فعال کردن آن استفاده کنید:

gcloud services enable bigquery.googleapis.com

۴. درخواست‌های API را تأیید اعتبار کنید

برای ارسال درخواست به BigQuery API، باید از یک حساب کاربری سرویس (Service Account) استفاده کنید. یک حساب کاربری سرویس متعلق به پروژه شماست و توسط کتابخانه کلاینت پایتون گوگل کلود (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"

در مرحله بعد، اعتبارنامه‌هایی ایجاد کنید که کد پایتون شما برای ورود به عنوان حساب سرویس جدید شما از آنها استفاده خواهد کرد. این اعتبارنامه‌ها را ایجاد کرده و با استفاده از دستور زیر، آن را به عنوان یک فایل 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

می‌توانید درباره احراز هویت API بیگ‌کوئری بیشتر بخوانید.

۵. کنترل دسترسی را تنظیم کنید

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
...

۶. کتابخانه کلاینت را نصب کنید

کتابخانه کلاینت BigQuery Python را نصب کنید:

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

اکنون آماده کدنویسی با API بیگ‌کوئری هستید!

۷. آثار شکسپیر را بررسی کنید

مجموعه داده عمومی، هر مجموعه داده‌ای است که در BigQuery ذخیره شده و در دسترس عموم قرار گرفته است. مجموعه داده‌های عمومی دیگری نیز برای جستجو در دسترس شما هستند. در حالی که برخی از مجموعه داده‌ها توسط گوگل میزبانی می‌شوند، اکثر آنها توسط اشخاص ثالث میزبانی می‌شوند. برای اطلاعات بیشتر به صفحه مجموعه داده‌های عمومی مراجعه کنید.

علاوه بر مجموعه داده‌های عمومی، BigQuery تعداد محدودی جدول نمونه ارائه می‌دهد که می‌توانید از آنها پرس‌وجو کنید. این جداول در مجموعه داده bigquery-public-data:samples قرار دارند. جدول shakespeare در مجموعه داده samples شامل یک فهرست کلمات از آثار شکسپیر است. این فهرست تعداد دفعاتی را که هر کلمه در هر مجموعه متن ظاهر می‌شود، نشان می‌دهد.

در این مرحله، جدول shakespeare را جستجو خواهید کرد.

ابتدا، در Cloud Shell یک برنامه پایتون ساده ایجاد کنید که برای اجرای نمونه‌های 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

۸. کوئری گرفتن از مجموعه داده‌های گیت‌هاب

برای آشنایی بیشتر با BigQuery، اکنون یک کوئری در مجموعه داده‌های عمومی GitHub ایجاد خواهید کرد. رایج‌ترین پیام‌های commit را در GitHub خواهید یافت. همچنین از کنسول وب BigQuery برای پیش‌نمایش و اجرای کوئری‌های ad-hoc استفاده خواهید کرد.

برای دیدن ظاهر داده‌ها، مجموعه داده 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

۹. ذخیره‌سازی و آمار

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، ذخیره سازی غیرفعال شده است. دوم اینکه، شما از شیء job به آمار مربوط به پرس و جو دسترسی پیدا کرده‌اید.

دوباره به 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

۱۰. بارگذاری داده‌ها در BigQuery

اگر می‌خواهید داده‌های خودتان را جستجو کنید، باید داده‌های خود را در BigQuery بارگذاری کنید. BigQuery از بارگذاری داده‌ها از منابع زیادی از جمله فضای ذخیره‌سازی ابری، سایر سرویس‌های گوگل و سایر منابع قابل خواندن پشتیبانی می‌کند. حتی می‌توانید داده‌های خود را با استفاده از درج‌های جریانی پخش کنید. برای اطلاعات بیشتر به صفحه بارگذاری داده‌ها در 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

۱۱. تبریک می‌گویم!

شما یاد گرفتید که چگونه از BigQuery با پایتون استفاده کنید!

تمیز کردن

برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این آموزش:

  • در کنسول ابری، به صفحه مدیریت منابع بروید.
  • در لیست پروژه‌ها، پروژه خود را انتخاب کنید و سپس روی حذف کلیک کنید.
  • در کادر محاوره‌ای، شناسه پروژه را تایپ کنید و سپس برای حذف پروژه، روی خاموش کردن (Shut down) کلیک کنید.

بیشتر بدانید

مجوز

این اثر تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است.