استخدام BigQuery مع Python

1. نظرة عامة

BigQuery هو مستودع بيانات إحصائية منخفض التكلفة من Google مُدار بالكامل على نطاق بيتابايت. BigQuery هو NoOps - لا توجد بنية أساسية لإدارتها ولا تحتاج إلى مشرف قاعدة بيانات - لذلك يمكنك التركيز على تحليل البيانات للعثور على إحصاءات ذات مغزى، واستخدام SQL المألوف، والاستفادة من نموذج الدفع حسب الاستخدام.

في هذا الدرس التطبيقي حول الترميز، ستستخدم Google Cloud Client Libraries للغة Python لإجراء طلب بحث عن مجموعات البيانات العامة في BigQuery باستخدام Python.

المعلومات التي ستطّلع عليها

  • كيفية استخدام Cloud Shell
  • كيفية تفعيل BigQuery API
  • كيفية مصادقة طلبات البيانات من واجهة برمجة التطبيقات
  • كيفية تثبيت مكتبة برامج Python
  • طريقة الاستعلام عن أعمال شكسبير
  • كيفية الاستعلام عن مجموعة بيانات GitHub
  • كيفية ضبط التخزين المؤقت وإحصاءات العرض

المتطلبات

  • مشروع على Google Cloud
  • متصفح، مثل Chrome أو Firefox
  • الإلمام باستخدام بايثون

استطلاع

كيف ستستخدم هذا البرنامج التعليمي؟

القراءة فقط اقرأها وأكمِل التمارين

كيف تقيّم تجربتك مع Python؟

حديث متوسط بارع

ما هو تقييمك لتجربتك في استخدام خدمات Google Cloud؟

حديث متوسط بارع

2. الإعداد والمتطلبات

إعداد بيئة ذاتية

  1. سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي عبارة عن سلسلة أحرف لا تستخدمها Google APIs، ويمكنك تحديثها في أي وقت.
  • يجب أن يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد ضبطه). تنشئ Cloud Console سلسلة فريدة تلقائيًا. فعادةً لا تهتم بما هو. في معظم الدروس التطبيقية حول الترميز، يجب الرجوع إلى رقم تعريف المشروع (والذي يتم تحديده عادةً على أنّه PROJECT_ID). لذلك، إذا لم يعجبك، يمكنك إنشاء رقم تعريف عشوائي آخر أو يمكنك تجربة رقم تعريف المشروع الخاص بك ومعرفة ما إذا كان متاحًا. بعد ذلك تكون الحالة "مجمّدة". بعد إنشاء المشروع.
  • هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام الموارد/واجهات برمجة التطبيقات في Cloud. إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. لإيقاف تشغيل الموارد حتى لا تتحمل الفوترة بعد أكثر من هذا البرنامج التعليمي، اتبع أي عملية "تنظيف". التعليمات الموجودة في نهاية الدرس التطبيقي حول الترميز. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج فترة تجريبية مجانية بقيمة 300 دولار أمريكي.

بدء Cloud Shell

مع أنّه يمكن إدارة Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدرس التطبيقي Google Cloud Shell، وهي بيئة سطر أوامر يتم تشغيلها في السحابة الإلكترونية.

تفعيل Cloud Shell

  1. من Cloud Console، انقر على تفعيل Cloud Shell 853e55310c205094.png.

55efc1aaa7a4d3ad.png

إذا لم يسبق لك بدء تشغيل Cloud Shell، ستظهر لك شاشة وسيطة (الجزء السفلي غير المرئي من الصفحة) تصف ماهيتها. إذا كان الأمر كذلك، فانقر على متابعة (ولن تراه مرة أخرى مطلقًا). إليك ما تبدو عليه هذه الشاشة التي تُستخدم لمرة واحدة:

9c92662c6a846a5c.png

من المفترَض أن تستغرق عملية إدارة الحسابات والاتصال بخدمة Cloud Shell بضع دقائق فقط.

9f0e51b578fecce5.png

يتم تحميل هذا الجهاز الافتراضي مع جميع أدوات التطوير التي تحتاجها. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ معظم عملك، إن لم يكن كلّه، في هذا الدرس التطبيقي حول الترميز باستخدام متصفّح أو جهاز 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- تفعيل واجهة برمجة التطبيقات

يجب تفعيل 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. مصادقة طلبات البيانات من واجهة برمجة التطبيقات

لإرسال طلبات إلى BigQuery API، عليك استخدام حساب الخدمة. ينتمي حساب الخدمة إلى مشروعك، وتستخدمه مكتبة برامج Google Cloud Python لإجراء طلبات BigQuery API. مثل أي حساب مستخدم آخر، يتم تمثيل حساب الخدمة بعنوان بريد إلكتروني. في هذا القسم، ستستخدم حزمة تطوير البرامج (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 الذي تستخدمه مكتبة برامج Python في BigQuery، والذي سنتناوله في الخطوة التالية، للعثور على بيانات الاعتماد. يجب ضبط متغيّر البيئة على المسار الكامل لملف 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 على "خطأ". ثانيًا، قمت بالوصول إلى الإحصائيات حول الاستعلام من كائن الوظيفة.

مرة أخرى في 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 Console، انتقِل إلى صفحة إدارة الموارد.
  • في قائمة المشاريع، اختَر مشروعك، ثم انقر على حذف.
  • في مربّع الحوار، اكتب رقم تعريف المشروع ثم انقر على إيقاف التشغيل لحذف المشروع.

مزيد من المعلومات

الترخيص

هذا العمل مرخّص بموجب رخصة المشاع الإبداعي 2.0 مع نسب العمل إلى مؤلف عام.