لقد أحدثت Google BigQuery ثورة في الطريقة التي تتعامل بها المنظمات مع تحليلات البيانات واسعة النطاق. تجعل بنية الخادم بدون خادم، وقابلية التوسع، وواجهة SQL المألوفة أداة قوية لاستخلاص الرؤى من مجموعات البيانات الضخمة. بينما يعد التفاعل مع BigQuery من خلال وحدة تحكم Google Cloud أو أداة سطر الأوامر bq
أمرًا شائعًا، فإن القوة الحقيقية للأتمتة والتكامل وتطوير التطبيقات المخصصة تنفتح من خلال مجموعة شاملة من واجهات برمجة التطبيقات (APIs).
تقدم هذه الدليل استكشافًا خطوة بخطوة حول كيفية استخدام واجهات برمجة التطبيقات BigQuery، مما يمكنّك من التفاعل برمجيًا مع مستودع بياناتك، وبناء خطوط بيانات، ودمج BigQuery في تطبيقاتك، وإدارة الموارد بفعالية. سنغطي الأنواع المختلفة لواجهات برمجة التطبيقات المتاحة، وكيفية إعداد بيئتك، وأمثلة عملية باستخدام مكتبة عميل Python، ونعرف بواجهات برمجة التطبيقات المتخصصة للاستخدامات المتقدمة.
هل تريد منصة متكاملة، شاملة لفريق المطورين لديك للعمل معًا بأقصى إنتاجية؟
يقدم Apidog جميع متطلباتك، ويستبدل Postman بسعر أكثر ملاءمة بكثير!

فهم واجهات برمجة التطبيقات من BigQuery
قبل الغوص في الكود، من الضروري فهم المفاهيم الأساسية والطرق المختلفة التي يمكنك من خلالها التفاعل برمجيًا مع BigQuery.
المفاهيم الأساسية لـ BigQuery:
- المشروع: الحاوية على أعلى مستوى في Google Cloud، التي تحتوي على جميع مواردك، بما في ذلك مجموعات بيانات BigQuery، والجداول، والوظائف. عادةً ما تتم إدارة الفواتير والأذونات على مستوى المشروع.
- مجموعة البيانات: حاوية للجداول والعروض ضمن مشروع محدد. تساعد مجموعات البيانات في تنظيم بياناتك والتحكم في الوصول. اعتبرها كالمخططات أو قواعد البيانات في الأنظمة التقليدية.
- الجدول: يحتفظ ببياناتك الهيكلية في صفوف وأعمدة مع مخطط محدد. يدعم BigQuery أنواع البيانات المختلفة والحقول المتداخلة/المكررة.
- الوظيفة: تمثل الإجراءات غير المتزامنة التي يتم تنفيذها في BigQuery، مثل تشغيل الاستعلامات، أو تحميل البيانات، أو تصدير البيانات، أو نسخ الجداول. تتيح لك واجهات برمجة التطبيقات بدءَ هذه الوظائف ومراقبتها وإدارتها.
أنواع واجهات برمجة التطبيقات من BigQuery:
تقدم BigQuery عدة طرق للتفاعل مع خدماتها برمجيًا:
REST API: هذه هي واجهة برمجة التطبيقات الأساسية المبنية على HTTP وJSON. توفر وصولًا مباشرًا إلى موارد BigQuery والعمليات. يمكنك التفاعل معها باستخدام طلبات HTTP القياسية (GET، POST، PUT، DELETE) تستهدف نقاط نهاية محددة (على سبيل المثال، https://bigquery.googleapis.com/bigquery/v2/projects/{projectId}/datasets
). بينما هي قوية وتوفر تحكمًا دقيقًا، يتطلب استخدام واجهة برمجة تطبيقات REST مباشرةً التعامل مع المصادقة، وتنسيق الطلب، وتحليل الاستجابة، ومعالجة الأخطاء يدويًا. غالبًا ما تتضمن المصادقة رموز وصول OAuth 2.0.
مكتبات العملاء: تقدم Google مكتبات عملاء عالية المستوى لعدة لغات برمجة شائعة (بما في ذلك Python وJava وGo وNode.js وC# وPHP وRuby). تغلف هذه المكتبات واجهة برمجة التطبيقات REST الأساسية، وتقدم تجربة أكثر تعبيرًا، ومريحة للمطورين. تبسط المهام الشائعة، وتتعامل مع المصادقة (غالبًا بشكل تلقائي عبر بيانات اعتماد التطبيق الافتراضية)، وتدير الإعادة، وتقلل من كمية الكود الأولي الذي تحتاج إلى كتابته. هذه هي الطريقة الموصى بها لمعظم تطوير التطبيقات.
واجهات برمجة التطبيقات المتخصصة: لمهام محددة عالية الأداء أو متخصصة، تقدم BigQuery واجهات برمجة تطبيقات مخصصة:
- واجهة برمجة تطبيقات قراءة تخزين BigQuery: مصممة لقراءة البيانات عالية الإنتاجية مباشرة من تخزين BigQuery المدارة. إنها أسرع بكثير من تصدير نتائج الاستعلام القياسية، وخاصة لمجموعات البيانات الكبيرة، وتتوافق جيدًا مع أطر معالجة البيانات مثل Apache Spark وApache Beam وPandas. تتيح القراءة المتوازية عبر عدة تدفقات.
- واجهة برمجة تطبيقات الاتصال BigQuery: تمكّنك من إنشاء وإدارة اتصالات بمصادر بيانات خارجية، مثل Cloud SQL وSpanner وCloud Storage. وهذا يسمح لك باستعلام البيانات في هذه الأنظمة الخارجية مباشرة من BigQuery باستخدام وظيفة
EXTERNAL_QUERY
، دون الحاجة إلى تحميل البيانات إلى BigQuery أولاً. - واجهة برمجة تطبيقات Analytics Hub: تسهل مشاركة البيانات الآمنة وقابلة للتوسع عبر منظمات أو وحدات عمل مختلفة. يسمح لك بإنشاء "قوائم" - مراجع قابلة للمشاركة لمجموعات البيانات - ضمن "تبادلات البيانات". يمكن للمستهلكين الاشتراك في هذه القوائم للوصول إلى البيانات المشتركة ضمن مشاريعهم الخاصة.
- واجهة برمجة تطبيقات BigLake: تُستخدم لإدارة جداول BigLake. يسمح لك BigLake بإنشاء جداول في BigQuery تعمل على بيانات مخزنة في تنسيقات مفتوحة (مثل Parquet وORC وAvro) في بحيرات البيانات (بشكل رئيسي Google Cloud Storage). وهذا يوفر واجهة موحدة لاستعلام كل من تخزين BigQuery المدارة وتخزين بحيرات البيانات مع أمان وحوكمة متسقين.
إعداد بيئتك
قبل أن تتمكن من بدء إجراء مكالمات APIs، تحتاج إلى تكوين بيئتك المحلية أو الخادم.
المتطلبات المسبقة:
- حساب Google Cloud: تحتاج إلى حساب Google Cloud نشط.
- مشروع Google Cloud: قم بإنشاء مشروع جديد أو حدد واحدًا موجودًا في وحدة تحكم Google Cloud. لاحظ معرّف مشروعك.
- تمكين واجهة برمجة تطبيقات BigQuery: تأكد من تمكين واجهة برمجة تطبيقات BigQuery لمشروعك. يمكنك القيام بذلك عبر وحدة التحكم السحابية (APIs & Services > Library > البحث عن "واجهة برمجة تطبيقات BigQuery" > تمكين). قد تحتاج أيضًا إلى تمكين واجهات برمجة التطبيقات الأخرى مثل واجهة برمجة تطبيقات تخزين BigQuery أو واجهة برمجة تطبيقات اتصال BigQuery بناءً على حالة الاستخدام الخاصة بك.
- الفوترة: تأكد من تمكين الفوترة لمشروعك. تتسبب عمليات BigQuery في تكاليف بناءً على تخزين البيانات، وتحليل العمليات، وإدراج التدفقيات.
المصادقة:
تحتاج تطبيقك إلى مصادقة إلى Google Cloud لإثبات هويتها وتفويض الوصول إلى موارد BigQuery. الطريقة الموصى بها لمعظم السيناريوهات هي بيانات اعتماد التطبيق الافتراضية (ADC).
- بيانات اعتماد التطبيق الافتراضية (ADC): تسمح لك هذه الاستراتيجية بأن يجد تطبيقك بيانات الاعتماد تلقائيًا بناءً على البيئة التي يعمل فيها، دون الحاجة إلى تضمين المفاتيح مباشرة في الكود.
- التطوير المحلي: قم بتثبيت واجهة سطر الأوامر Google Cloud (
gcloud
). نفذ الأمرgcloud auth application-default login
. سيفتح هذا نافذة متصفح لتسجيل الدخول باستخدام حساب Google الخاص بك، مما يمنح SDK إمكانية الوصول إلى بيانات اعتمادك. ستكتشف مكتبات العملاء هذه البيانات الاعتماد تلقائيًا. - Compute Engine وCloud Functions وApp Engine وما إلى ذلك: تستخدم ADC تلقائيًا حساب الخدمة المرتبط بالموارد التي يعمل فيها كودك.
- حسابات الخدمة: للتطبيقات التي تعمل خارج Google Cloud أو تتطلب أذونات محددة، يمكنك استخدام حسابات الخدمة.
- قم بإنشاء حساب خدمة في وحدة التحكم السحابية (IAM & Admin > Service Accounts).
- امنح الأدوار اللازمة لـ BigQuery (مثل
BigQuery Data Editor
وBigQuery Job User
وBigQuery User
) لحساب الخدمة. - قم بتنزيل ملف مفتاح حساب الخدمة (بتنسيق JSON).
- اضبط متغير البيئة
GOOGLE_APPLICATION_CREDENTIALS
إلى المسار المطلق لملف المفتاح JSON الذي تم تنزيله. ستستخدم مكتبات العملاء هذا المفتاح للمصادقة إذا تم تعيين متغير البيئة.
تثبيت مكتبات العملاء (مثال Python):
سنركز على Python لأمثلتنا. يمكنك تثبيت المكتبات الضرورية باستخدام pip
:
pip install google-cloud-bigquery
# اختياري: تثبيت مكتبة API للتخزين لقراءات أسرع
pip install google-cloud-bigquery-storage
# اختياري: تثبيت تكامل Pandas وdb-dtypes لتحسين معالجة الأنواع
pip install pandas db-dtypes pyarrow
تأكد من أنك قد قمت بتثبيت Python (يوصى بالإصدار 3.7+ لأحدث ميزات المكتبة).
استخدام مكتبة عميل BigQuery (أمثلة Python)
الآن، دعنا نستكشف العمليات الشائعة في BigQuery باستخدام مكتبة Python google-cloud-bigquery
.
1. استيراد وت inicializar العميل:
أولاً، استورد المكتبة. ثم، أنشئ مثيل عميل. إذا تم تكوين ADC بشكل صحيح، فسوف يقوم العميل بالمصادقة تلقائيًا.
from google.cloud import bigquery
import pandas as pd
# إنشئ كائن عميل BigQuery.
# إذا تم تعيين GOOGLE_APPLICATION_CREDENTIALS، فإنه يستخدم حساب الخدمة.
# إذا تم تشغيل gcloud auth application-default login، فإنه يستخدم تلك البيانات الاعتمادية.
# إذا كان قيد التشغيل على بنية GCP، فإنه يستخدم حساب الخدمة الخاص بال实例.
client = bigquery.Client()
# يمكنك تحديد معرّف المشروع صراحة إذا لزم الأمر،
# وإلا فإنه يستنتج عمومًا من البيئة/بيانات اعتماد ADC.
# client = bigquery.Client(project='your-project-id')
print("تم إنشاء العميل بنجاح.")
2. تشغيل الاستعلامات:
عملية الأكثر شيوعًا هي تشغيل استعلامات SQL.
- استعلام بسيط متزامن: للاستعلامات المتوقعة أن تكتمل بسرعة.
query_and_wait()
ترسل الاستعلام وتنتظر النتائج.
# تعريف استعلام SQL الخاص بك
query = """
SELECT name, SUM(number) as total_people
FROM `bigquery-public-data.usa_names.usa_1910_2013`
WHERE state = 'TX'
GROUP BY name, state
ORDER BY total_people DESC
LIMIT 10
"""
# قم بإجراء طلب API وانتظر حتى يكمل الوظيفة.
query_job = client.query(query) # طلب API
print(f"بدأت الوظيفة: {query_job.job_id}")
# انتظر حتى تكتمل الوظيفة واحصل على النتائج.
rows = query_job.result() # ينتظر حتى تكتمل الوظيفة.
print("\nأعلى 10 أسماء في TX (1910-2013):")
for row in rows:
# يمكن الوصول إلى قيم الصف بواسطة اسم الحقل أو الفهرس.
print(f"الاسم: {row.name}, العدد: {row['total_people']}") # الوصول بواسطة السمة أو المفتاح
# تحويل النتائج إلى DataFrame من Pandas
df = rows.to_dataframe()
print("\nالنتائج كـ DataFrame من Pandas:")
print(df.head())
- استعلامات غير متزامنة: للاستعلامات طويلة الأمد، ابدأ الوظيفة وتحقق من حالتها لاحقًا.
query = """
SELECT corpus, COUNT(word) as distinct_words
FROM `bigquery-public-data.samples.shakespeare`
GROUP BY corpus
ORDER BY distinct_words DESC;
"""
job_config = bigquery.QueryJobConfig(
# استخدام صياغة SQL القياسية للاستعلامات.
use_legacy_sql=False
)
# ابدأ الاستعلام، مع تمرير التكوين الإضافي.
query_job = client.query(query, job_config=job_config) # لا ينتظر
print(f"بدأت الوظيفة غير المتزامنة: {query_job.job_id}")
# --- لاحقًا في تطبيقك ---
# تحقق من حالة الوظيفة (اختياري)
# from google.cloud.exceptions import NotFound
# try:
# job = client.get_job(query_job.job_id, location=query_job.location)
# print(f"حالة الوظيفة {job.job_id}: {job.state}")
# if job.state == "DONE":
# if job.error_result:
# print(f"فشلت الوظيفة: {job.errors}")
# else:
# results = job.result() # احصل على النتائج
# print("تم جلب النتائج.")
# # معالجة النتائج...
# except NotFound:
# print(f"لم يتم العثور على الوظيفة {query_job.job_id}.")
# أو انتظر ببساطة حتى الاكتمال عندما يحتاج الأمر
results = query_job.result() # ستقوم هذه بالت BLOCK حتى تنتهي الوظيفة
print("اكتملت الوظيفة غير المتزامنة.")
for row in results:
print(f"النص: {row.corpus}, الكلمات المميزة: {row.distinct_words}")
- استعلامات معلمات: ضرورية للأمان (لمنع حقن SQL) عند دمج إدخال المستخدم في الاستعلامات.
from google.cloud.bigquery import ScalarQueryParameter, ArrayQueryParameter, StructQueryParameter, QueryJobConfig
# مثال: العثور على أسماء تبدأ ببادئة محددة في ولاية معينة
state_param = "NY"
prefix_param = "Ma"
min_count_param = 1000
query = """
SELECT name, SUM(number) as total_people
FROM `bigquery-public-data.usa_names.usa_1910_2013`
WHERE state = @state_abbr AND name LIKE @name_prefix
GROUP BY name
HAVING total_people >= @min_count
ORDER BY total_people DESC;
"""
job_config = QueryJobConfig(
query_parameters=[
ScalarQueryParameter("state_abbr", "STRING", state_param),
# استخدم 'val%' لمشغل LIKE
ScalarQueryParameter("name_prefix", "STRING", f"{prefix_param}%"),
ScalarQueryParameter("min_count", "INT64", min_count_param),
]
)
query_job = client.query(query, job_config=job_config)
print(f"بدأت وظيفة الاستعلام المعلمة: {query_job.job_id}")
rows = query_job.result()
print(f"\nالأسماء التي تبدأ بـ '{prefix_param}' في {state_param} مع >= {min_count_param} شخص:")
for row in rows:
print(f"الاسم: {row.name}, العدد: {row.total_people}")
3. إدارة مجموعات البيانات:
يمكنك إنشاء، قائمة، والحصول على تفاصيل، وحذف مجموعات البيانات.
# تعريف معرّف مجموعة البيانات والموقع
project_id = client.project
dataset_id = f"{project_id}.my_new_dataset"
dataset_location = "US" # على سبيل المثال، "US"، "EU"، "asia-northeast1"
# بناء كائن Dataset كامل لإرساله إلى واجهة برمجة التطبيقات.
dataset = bigquery.Dataset(dataset_id)
dataset.location = dataset_location
dataset.description = "مجموعة البيانات التي تم إنشاؤها عبر مكتبة عميل Python"
try:
# إجراء طلب API لإنشاء مجموعة البيانات.
dataset = client.create_dataset(dataset, timeout=30) # إجراء طلب API.
print(f"تم إنشاء مجموعة البيانات {client.project}.{dataset.dataset_id}")
# قائمة مجموعات البيانات في المشروع
print("\nمجموعات البيانات في المشروع:")
datasets = list(client.list_datasets()) # طلب API
if datasets:
for ds in datasets:
print(f"\t{ds.dataset_id}")
else:
print(f"\tالمشروع {client.project} لا يحتوي على أي مجموعات بيانات.")
# الحصول على معلومات مجموعة البيانات
retrieved_dataset = client.get_dataset(dataset_id) # طلب API
print(f"\nاسترداد معلومات مجموعة البيانات لـ {dataset_id}:")
print(f"\tالوصف: {retrieved_dataset.description}")
print(f"\tالموقع: {retrieved_dataset.location}")
except Exception as e:
print(f"حدث خطأ أثناء عمليات مجموعة البيانات: {e}")
finally:
# تنظيف: حذف مجموعة البيانات
try:
client.delete_dataset(
dataset_id, delete_contents=True, not_found_ok=True
) # طلب API
print(f"\nتم حذف مجموعة البيانات '{dataset_id}' بنجاح.")
except Exception as e:
print(f"خطأ في حذف مجموعة البيانات {dataset_id}: {e}")
4. إدارة الجداول:
توجد عمليات مشابهة للجداول: إنشاء الجداول (تحديد المخطط)، تحميل البيانات، الحصول على البيانات الوصفية، وحذف الجداول.
# باستخدام معرّف مجموعة البيانات التي تم إنشاؤها سابقًا (تأكد من وجودها أو إزالة خطوة الحذف أعلاه)
dataset_id_for_table = "my_new_dataset" # استخدم معرّف مجموعة بيانات صالح
table_id = f"{client.project}.{dataset_id_for_table}.my_new_table"
# تحديد المخطط
schema = [
bigquery.SchemaField("full_name", "STRING", mode="REQUIRED"),
bigquery.SchemaField("age", "INTEGER", mode="REQUIRED"),
bigquery.SchemaField("email", "STRING", mode="NULLABLE"),
]
# إنشاء الجدول
table = bigquery.Table(table_id, schema=schema)
try:
# تأكد من أن مجموعة البيانات موجودة أولاً
client.create_dataset(dataset_id_for_table, exists_ok=True)
table = client.create_table(table) # طلب API
print(
f"تم إنشاء الجدول {table.project}.{table.dataset_id}.{table.table_id}"
)
# --- تحميل البيانات (مثال: من pandas DataFrame) ---
data = {'full_name': ['Alice Smith', 'Bob Johnson'],
'age': [30, 45],
'email': ['alice@example.com', None]}
dataframe = pd.DataFrame(data)
job_config = bigquery.LoadJobConfig(
# يُوصى بتحديد المخطط، مما يضمن الأنواع الصحيحة
schema=schema,
# اختياري: الكتابة فوق بيانات الجدول
write_disposition="WRITE_TRUNCATE",
# أو الإضافة: write_disposition="WRITE_APPEND",
)
load_job = client.load_table_from_dataframe(
dataframe, table_id, job_config=job_config
) # طلب API
print(f"بدء الوظيفة {load_job.job_id} لتحميل البيانات من DataFrame")
load_job.result() # ينتظر حتى تكتمل الوظيفة.
print("اكتمل تحميل وظيفة DataFrame.")
destination_table = client.get_table(table_id) # طلب API
print(f"تم تحميل {destination_table.num_rows} صفًا في الجدول {table_id}")
# --- تحميل البيانات (مثال: من URI لتخزين Google Cloud) ---
# افترض وجود ملف CSV gs://your-bucket/data.csv يحتوي على بيانات متوافقة
# uri = "gs://your-bucket/data.csv"
# job_config_gcs = bigquery.LoadJobConfig(
# schema=schema,
# skip_leading_rows=1, # تخطى صف الرأس
# source_format=bigquery.SourceFormat.CSV,
# write_disposition="WRITE_APPEND", # الإضافة إلى البيانات الموجودة
# )
# load_job_gcs = client.load_table_from_uri(
# uri, table_id, job_config=job_config_gcs
# )
# print(f"بدء الوظيفة {load_job_gcs.job_id} لتحميل البيانات من GCS")
# load_job_gcs.result()
# print("اكتمل تحميل GCS.")
# destination_table = client.get_table(table_id)
# print(f"إجمالي الصفوف بعد تحميل GCS: {destination_table.num_rows}")
except Exception as e:
print(f"حدث خطأ أثناء عمليات الجدول: {e}")
finally:
# تنظيف: حذف الجدول
try:
client.delete_table(table_id, not_found_ok=True) # طلب API
print(f"تم حذف الجدول '{table_id}' بنجاح.")
# اختياريًا حذف مجموعة البيانات مرة أخرى إذا كانت لمجرد هذا المثال
# client.delete_dataset(dataset_id_for_table, delete_contents=True, not_found_ok=True)
# print(f"تم حذف مجموعة البيانات '{dataset_id_for_table}' بنجاح.")
except Exception as e:
print(f"خطأ في حذف الجدول {table_id}: {e}")
5. العمل مع الوظائف:
تخلق جميع العمليات غير المتزامنة (الاستعلام، التحميل، التصدير، النسخ) موارد الوظيفة. يمكنك سرد وإدارة هذه الوظائف.
# قائمة الوظائف الحديثة
print("\nوظائف BigQuery الحديثة:")
for job in client.list_jobs(max_results=10): # طلب API
print(f"معرّف الوظيفة: {job.job_id}, النوع: {job.job_type}, الحالة: {job.state}, التاريخ: {job.created}")
# الحصول على وظيفة محددة (استبدل بمعرّف وظيفة صالح من التشغيلات السابقة)
# try:
# job_id_to_get = "..." # استبدل بمعرّف وظيفة حقيقي
# location = "US" # استبدل بموقع الوظيفة إذا لم يكن الافتراضي
# retrieved_job = client.get_job(job_id_to_get, location=location) # طلب API
# print(f"\nتفاصيل الوظيفة {retrieved_job.job_id}:")
# print(f"\tالحالة: {retrieved_job.state}")
# if retrieved_job.error_result:
# print(f"\tخطأ: {retrieved_job.errors}")
# except NotFound:
# print(f"لم يتم العثور على الوظيفة {job_id_to_get}.")
# except Exception as e:
# print(f"خطأ في استرداد الوظيفة: {e}")
استغلال واجهات برمجة التطبيقات المتخصصة (المفاهيم وحالات الاستخدام)
بينما تغطي مكتبة العميل الأساسية العديد من حالات الاستخدام، تقدم واجهات برمجة التطبيقات المتخصصة أداءً أفضل أو وظائف لمهام معينة.
1. واجهة برمجة تطبيقات قراءة تخزين BigQuery (Python):
- الغرض: استرداد بيانات سريع للغاية من جداول BigQuery، متجاوزًا محرك تنفيذ الاستعلام القياسي. مثالي لتصدير مجموعات البيانات الكبيرة أو تغذية البيانات في خطوط تدريب ML أو أطر معالجة البيانات.
- كيف يعمل: تقوم بإنشاء
ReadSession
تحدد الجدول، والأعمدة، ومرشحات الصف. تُرجع واجهة برمجة التطبيقات واحدًا أو أكثر منStreams
. تقرأ البيانات (عادةً في تنسيق Apache Arrow أو Avro) من هذه التدفقات، وغالبًا في وقت واحد. - مكتبة العميل:
google-cloud-bigquery-storage
- استخدام Python المفاهيمي (مع تكامل Pandas):
# يتطلب: pip install google-cloud-bigquery-storage pyarrow pandas db-dtypes
from google.cloud import bigquery_storage_v1
from google.cloud.bigquery_storage_v1 import types, GetDataStreamRequest
# --- باستخدام Pandas read_gbq (أبسط تكامل) ---
# هذا يستخدم تلقائيًا واجهة تخزين API إذا تم تثبيتها وكانت مفيدة
# table_id_read = "bigquery-public-data.usa_names.usa_1910_2013"
# cols_to_read = ["name", "number", "state"]
# row_filter = "state = 'CA' AND number > 5000"
#
# try:
# df_storage = pd.read_gbq(
# table_id_read,
# project_id=client.project,
# columns=cols_to_read,
# row_filter=row_filter,
# use_bqstorage_api=True, # طلب صريح لواجهة تخزين API
# progress_bar_type='tqdm' # شريط تقدم اختياري
# )
# print("\nتم قراءة البيانات باستخدام API التخزين عبر pandas.read_gbq:")
# print(df_storage.head())
# print(f"تم قراءة {len(df_storage)} صفوف.")
# except Exception as e:
# print(f"خطأ في قراءة البيانات باستخدام API التخزين عبر read_gbq: {e}")
# --- استخدام واجهة APIs التخزين يدويًا (المزيد من التحكم) ---
# bqstorageclient = bigquery_storage_v1.BigQueryReadClient()
# table = f"projects/{project_id}/datasets/{dataset_id}/tables/{table_name}" # استبدل بتفاصيل جدولك
# requested_session = types.ReadSession(
# table=table,
# data_format=types.DataFormat.ARROW,
# read_options=types.ReadSession.TableReadOptions(
# selected_fields=["col1", "col2"], # تحديد الأعمدة
# row_restriction="col1 > 100" # تحديد المرشح
# ),
# )
# parent = f"projects/{project_id}"
# read_session = bqstorageclient.create_read_session(
# parent=parent,
# read_session=requested_session,
# max_stream_count=1, # اطلب عدد التدفقات المتوازية
# )
# stream = read_session.streams[0]
# reader = bqstorageclient.read_rows(stream.name)
# frames = [message.arrow_record_batch for message in reader.messages()]
# if frames:
# arrow_table = pa.Table.from_batches(frames)
# df_manual = arrow_table.to_pandas()
# print("\nتم قراءة البيانات يدويًا باستخدام API التخزين:")
# print(df_manual.head())
# else:
# print("لم يتم قراءة أي بيانات باستخدام API التخزين اليدوي.")
2. واجهة برمجة التطبيقات للاتصال BigQuery:
- الغرض: استعلام مصادر البيانات الخارجية (Cloud SQL وSpanner وCloud Storage) مباشرةً من BigQuery دون تحريك البيانات.
- كيف يعمل:
- استخدم واجهة برمجة التطبيقات (أو وحدة التحكم السحابية/
bq
tool) لإنشاء موردConnection
، مع تحديد نوع المصدر الخارجي والتفاصيل. - امنح حساب الخدمة الخاص بالاتصال الأذونات المناسبة على المورد الخارجي (على سبيل المثال، دور مستخدم Cloud SQL).
- استخدم الدالة
EXTERNAL_QUERY("connection_id", "external_sql_query")
ضمن SQL الخاص بك في BigQuery.
- مكتبة العميل:
google-cloud-bigquery-connection
تقدم طرقًا مثلcreate_connection
وget_connection
وlist_connections
وdelete_connection
.
3. واجهة برمجة التطبيقات للتحليلات Analytics Hub:
- الغرض: مشاركة مجموعات البيانات المنقحة بأمان عبر المنظمات أو الفرق.
- المفاهيم الرئيسية:
- تبادل البيانات: حاوية لمشاركة البيانات. يمكن أن تكون عامة أو خاصة.
- قائمة: مرجع لمجموعة بيانات BigQuery معينة (أو ربما عرض/جدول في المستقبل) يتم مشاركتها داخل تبادل. ينشئ الناشرون قوائم؛ ويدخل المشتركون الوصول إليها.
- واجهات برمجة التطبيقات: متاحة عبر REST ومكتبات العملاء (مثل
google-cloud-analyticshub
) لإدارة عمليات التبادل والقوائم والاشتراكات برمجيًا.
4. واجهة برمجة التطبيقات BigLake:
- الغرض: إدارة جداول BigLake، التي تسمح باستعلام البيانات في تخزين Cloud باستخدام واجهة وحوكمة BigQuery.
- كيف يعمل: تحديد جدول في BigQuery يشير إلى ملفات البيانات (Parquet وORC وما إلى ذلك) في دلو GCS. تُستخدم واجهة برمجة التطبيقات BigLake (أساسًا REST في الوقت الحاضر) لإنشاء وتحديث وإدارة البيانات الوصفية لهذه الجداول. تتم الاستعلامات من خلال SQL القياسي لـ BigQuery.
استخدام واجهة REST API مباشرة
على الرغم من أن مكتبات العملاء مفضلة عادةً، قد تحتاج إلى استخدام واجهة REST API مباشرةً إذا:
- كنت تستخدم لغة لا تحتوي على مكتبة عميل رسمية من Google.
- تحتاج إلى الوصول إلى ميزات متقدمة لم تُعرض بعد في المكتبات.
- تتطلب تحكمًا مطلقًا في دورة الطلب/الاستجابة HTTP.
إجراء الطلبات:
ستستخدم عادةً عميل HTTP (مثل curl
أو مكتبة requests
الخاصة بـ Python). تحتاج إلى:
- الحصول على رمز وصول OAuth 2.0 (على سبيل المثال، باستخدام
gcloud auth print-access-token
). - بناء عنوان URL الخاص بنقطة النهاية الصحيحة لواجهة برمجة التطبيقات.
- إنشاء جسم الطلب JSON وفقًا لمواصفات طريقة واجهة برمجة التطبيقات.
- تضمين رمز الوصول في رأس
Authorization: Bearer <token>
. - التعامل مع استجابة HTTP (أكواد الحالة، تحليل JSON، رسائل الخطأ).
مثال: تشغيل استعلام عبر REST (jobs.query
)
# 1. احصل على رمز الوصول
TOKEN=$(gcloud auth print-access-token)
# 2. تعريف معرّف المشروع وجسم الطلب
PROJECT_ID="your-project-id" # استبدل بمعرّف مشروعك
REQUEST_BODY=$(cat <<EOF
{
"query": "SELECT name, SUM(number) as total_people FROM \`bigquery-public-data.usa_names.usa_1910_2013\` WHERE state = 'CA' GROUP BY name ORDER BY total_people DESC LIMIT 5;",
"useLegacySql": false
}
EOF
)
# 3. إجراء مكالمة API باستخدام curl
curl -X POST \
"https://bigquery.googleapis.com/bigquery/v2/projects/${PROJECT_ID}/jobs" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json; charset=utf-8" \
-d "${REQUEST_BODY}"
# ستحتوي الاستجابة على معلومات الوظيفة، بما في ذلك معرّف الوظيفة.
# ستحتاج بعد ذلك إلى إجراء مكالمات متعاقبة إلى jobs.getQueryResults
# باستخدام معرّف الوظيفة لاسترداد الصفوف البيانات الفعلية بمجرد اكتمال الوظيفة.
هذا المثال يبدأ فقط وظيفة الاستعلام. يتطلب استرداد النتائج مراقبة حالة الوظيفة ثم استدعاء نقطة النهاية jobs.getQueryResults
. وهذا يبرز الخطوات الإضافية المتضمنة مقارنة بمكتبات العملاء.
أفضل الممارسات والنصائح
- فضل مكتبات العملاء: استخدم مكتبات عملاء Google Cloud كلما كان ذلك ممكنًا لسهولة الصيانة والمتانة.
- استخدم ADC: الاعتماد على بيانات اعتماد التطبيق الافتراضية للمصادقة الأمر الذي يبسط النشر عبر بيئات مختلفة. تجنب تضمين بيانات الاعتماد في الكود.
- استعلامات معلمات: استخدم دائمًا استعلامات معلمات عند دمج الإدخال الخارجي لمنع ثغرات حقن SQL.
- تحسين الاستعلامات: اكتب SQL فعال. تجنب
SELECT *
، واستخدم جملWHERE
بشكل فعال، وفهم التقسيم والتجمع للحصول على أداء أفضل على الجداول الكبيرة. استخدم ميزة شرح خطة الاستعلام. - معالجة الأخطاء: تنفيذ معالجة أخطاء قوية، خاصة لمشاكل الشبكة أو أخطاء واجهة برمجة التطبيقات المحددة (مثل تجاوز الحصة، غير موجود). غالبًا ما تتضمن مكتبات العملاء آليات إعادة المحاولة المدمجة لأخطاء النقل.
- إدارة الموارد: قم بحذف مجموعات البيانات أو الجداول التي تم إنشاؤها أثناء الاختبار أو المعالجة المؤقتة لتجنب تكاليف التخزين غير الضرورية.
- مراقبة التكاليف والحصص: كن حذرًا من تسعير BigQuery (البيانات المعالجة للاستعلامات، تكاليف التخزين). راقب استخدامك وكن على دراية بحصص واجهة برمجة التطبيقات (مثل الحدود على الاستعلامات المتزامنة، وحدود معدل طلبات واجهة برمجة التطبيقات). استخدم ميزات مثل الحد الأقصى للبايت المخصص (
maximum_bytes_billed
فيJobConfig
) للتحكم في تكاليف الاستعلام. - استخدم واجهات برمجة التطبيقات المتخصصة: استفد من واجهة قراءة API للتصديرات/القراءات الكبيرة وواجهة الاتصال للاستعلام بكفاءة من المصادر الخارجية.
الخاتمة
تقدم واجهات برمجة التطبيقات BigQuery وسيلة قوية ومرنة للتفاعل برمجيًا مع مستودع بياناتك. سواء كنت بحاجة إلى أتمتة تحميل البيانات، أو تشغيل استعلامات تحليلية معقدة كجزء من تطبيق، أو دمج رؤى BigQuery في لوحات المعلومات، أو إدارة الموارد ديناميكيًا، توفر واجهات برمجة التطبيقات الأدوات اللازمة.
من خلال فهم الأنواع المختلفة من واجهات برمجة التطبيقات، وإعداد بيئتك بشكل صحيح، والاستفادة من便利 مكتبات العملاء (خصوصًا في Python)، يمكنك فتح الإمكانات الكاملة لـ BigQuery بخلاف وحدة التحكم التفاعلية. ابدأ بواجهة API الأساسية للمهام الشائعة، واستكشف واجهات برمجة التطبيقات المتخصصة مثل واجهة قراءة التخزين لأداء العمليات الحرجة، وتذكر أن واجهة REST API متاحة دائمًا للتحكم النهائي. بينما تبني التطبيقات على BigQuery، ستكون هذه الواجهات هي المكونات الأساسية لهندسة بياناتك.