שאילתות מאוחדות ב-Cloud SQL
כאנליסטים של נתונים, אתם יכולים להריץ שאילתות על נתונים ב-Cloud SQL מ-BigQuery באמצעות שאילתות מאוחדות.
פדרציית Cloud SQL ב-BigQuery מאפשרת ל-BigQuery לשלוח שאילתות לנתונים שנמצאים ב-Cloud SQL בזמן אמת, בלי להעתיק או להעביר את הנתונים. איחוד השאילתות תומך במופעי MySQL (דור שני) ו-PostgreSQL ב-Cloud SQL.
לחלופין, כדי לשכפל נתונים ל-BigQuery, אפשר להשתמש גם ב-Cloud Data Fusion או ב-Datastream. מידע נוסף על שימוש ב-Cloud Data Fusion זמין במאמר שכפול נתונים מ-MySQL ל-BigQuery.
לפני שמתחילים
- צריך לוודא שהאדמין של BigQuery יצר חיבור ל-Cloud SQL ושיתף אותו איתכם.
-
כדי לקבל את ההרשאות שנדרשות להפעלת שאילתה במכונת Cloud SQL, צריך לבקש מהאדמין להקצות לכם את תפקיד ה-IAM BigQuery Connection User (משתמש בחיבור BigQuery) (
roles/bigquery.connectionUser) בפרויקט. להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
שאילתת נתונים
כדי לשלוח שאילתה לכמה מסדי נתונים ל-Cloud SQL משאילתת GoogleSQL, משתמשים בפונקציה EXTERNAL_QUERY.
נניח שאתם מאחסנים טבלת לקוחות ב-BigQuery, ומאחסנים טבלת מכירות ב-Cloud SQL, ואתם רוצים לבצע הצטרפות של שתי הטבלאות בשאילתה אחת. בדוגמה הבאה מוצגת שאילתה לכמה מסדי נתונים לטבלה ב-Cloud SQL בשם orders, והתוצאות מצורפות לטבלה ב-BigQuery בשם mydataset.customers.
SELECT c.customer_id, c.name, rq.first_order_date
FROM mydataset.customers AS c
LEFT OUTER JOIN EXTERNAL_QUERY(
'us.connection_id',
'''SELECT customer_id, MIN(order_date) AS first_order_date
FROM orders
GROUP BY customer_id''') AS rq ON rq.customer_id = c.customer_id
GROUP BY c.customer_id, c.name, rq.first_order_date;
שאילתת הדוגמה כוללת 3 חלקים:
- מריצים את השאילתה החיצונית
SELECT customer_id, MIN(order_date) AS first_order_date FROM orders GROUP BY customer_idבמסד הנתונים התפעולי של PostgreSQL כדי לקבל את תאריך ההזמנה הראשון של כל לקוח באמצעות הפונקציהEXTERNAL_QUERY(). - מצטרפים לטבלת תוצאות השאילתה החיצונית עם טבלת הלקוחות ב-BigQuery באמצעות
customer_id. - בוחרים את נתוני הלקוח ואת תאריך ההזמנה הראשונה.
הצגת סכימת טבלה ב-Cloud SQL
אפשר להשתמש בפונקציה EXTERNAL_QUERY() כדי לבצע שאילתות בטבלאות information_schema כדי לגשת למטא-נתונים של מסד הנתונים, כמו רשימה של כל הטבלאות במסד הנתונים או הצגה של סכימת הטבלה. הדוגמאות הבאות של שאילתות information_schema פועלות גם ב-MySQL וגם ב-PostgreSQL. מידע נוסף זמין במאמרים בנושא טבלאות information_schema של MySQL וטבלאות information_schema של PostgreSQL.
-- List all tables in a database.
SELECT * FROM EXTERNAL_QUERY("connection_id",
"select * from information_schema.tables;");
-- List all columns in a table.
SELECT * FROM EXTERNAL_QUERY("connection_id",
"select * from information_schema.columns where table_name='x';");
פרטי התחברות
בטבלה הבאה מפורטים מאפייני החיבור של Cloud SQL:
| שם המאפיין | ערך | תיאור |
|---|---|---|
name |
מחרוזת | השם של משאב החיבור בפורמט: project_id.location_id.connection_id. |
location |
מחרוזת | המיקום של החיבור חייב להיות זהה למיקום של מכונת Cloud SQL או להיות מיקום במספר אזורים בתחום השיפוט המתאים. לדוגמה, מופע של Cloud SQL ב-us-east4 יכול להשתמש ב-US, ומכונה של Cloud SQL ב-europe-north1 יכולה להשתמש ב-EU. רק שאילתות BigQuery שמופעלות במיקום הזה יוכלו להשתמש בחיבור הזה. |
friendlyName |
מחרוזת | שם ידידותי לתצוגה של החיבור. |
description |
מחרוזת | תיאור החיבור. |
cloudSql.type |
מחרוזת | יכול להיות POSTGRES או MYSQL. |
cloudSql.instanceId |
מחרוזת | השם של המופע של Cloud SQL, בדרך כלל בפורמט הבא:Project-id:location-id:instance-idאפשר למצוא את מזהה המופע בדף הפרטים של המופע של Cloud SQL. |
cloudSql.database |
מחרוזת | מסד הנתונים של Cloud SQL שאליו רוצים להתחבר. |
cloudSql.serviceAccountId |
מחרוזת | חשבון השירות שהוגדר לגישה למסד הנתונים של Cloud SQL. |
בטבלה הבאה מפורטים המאפיינים של פרטי הכניסה של מכונת Cloud SQL:
| שם המאפיין | ערך | תיאור |
|---|---|---|
username |
מחרוזת | שם המשתמש במסד הנתונים |
password |
מחרוזת | סיסמת מסד הנתונים |
מעקב אחרי שאילתות מאוחדות ב-BigQuery
כשמריצים שאילתה לכמה מסדי נתונים ב-Cloud SQL, BigQuery מוסיף לשאילתה הערה שדומה להערה הבאה:
/* Federated query from BigQuery. Project ID: PROJECT_ID, BigQuery Job ID: JOB_ID. */
אם אתם עוקבים אחרי יומנים של שימוש בשאילתות במסד נתונים של MySQL או PostgreSQL, ההערה הבאה יכולה לעזור לכם לזהות שאילתות שמגיעות מ-BigQuery.
עוברים לדף Logs Explorer.
בכרטיסייה שאילתה, מזינים את השאילתה הבאה:
resource.type="cloudsql_database" textPayload=~"Federated query from BigQuery"לוחצים על Run query.
אם יש רשומות שזמינות לשאילתות מאוחדות ב-BigQuery, רשימה של רשומות שדומה לרשימה הבאה תופיע בתוצאות השאילתה:
YYYY-MM-DD hh:mm:ss.millis UTC [3210064]: [4-1] db=DATABASE, user=USER_ACCOUNT STATEMENT: SELECT 1 FROM (SELECT FROM company_name_table) t; /* Federated query from BigQuery. Project ID: PROJECT_ID, BigQuery Job ID: JOB_ID */ YYYY-MM-DD hh:mm:ss.millis UTC [3210532]: [2-1] db=DATABASE, user=USER_ACCOUNT STATEMENT: SELECT "company_id", "company type_id" FROM (SELECT FROM company_name_table) t; /* Federated query from BigQuery. Project ID: PROJECT_ID, BigQuery Job ID: JOB_ID */
פתרון בעיות
בקטע הזה מוסבר איך לפתור בעיות שאתם עלולים להיתקל בהן כשאתם שולחים שאילתה לכמה מסדי נתונים ל-Cloud SQL.
הבעיה: החיבור לשרת מסד הנתונים נכשל. אם אתם שולחים שאילתה למסד נתונים של MySQL, יכול להיות שתיתקלו בשגיאה הבאה:
Invalid table-valued function EXTERNAL_QUERY Failed to connect to MySQL database. Error: MysqlErrorCode(2013): Lost connection to MySQL server during query.
לחלופין, אם אתם שולחים שאילתה למסד נתונים של PostgreSQL, יכול להיות שתיתקלו בשגיאה הבאה:
Invalid table-valued function EXTERNAL_QUERY Connect to PostgreSQL server failed: server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.פתרון: מוודאים שהשתמשתם בפרטי כניסה תקינים ופעלתם לפי כל הדרישות המוקדמות כדי ליצור את החיבור ל-Cloud SQL. בודקים אם לחשבון השירות שנוצר באופן אוטומטי כשנוצר חיבור ל-Cloud SQL יש את התפקיד 'לקוח Cloud SQL' (
roles/cloudsql.client). חשבון השירות הוא בפורמט הבא:service-PROJECT_NUMBER@gcp-sa-bigqueryconnection.iam.gserviceaccount.com. הוראות מפורטות מופיעות במאמר מתן גישה לחשבון השירות.אם מכונת Cloud SQL משתמשת בכתובת IP פרטית, צריך לוודא שהפעלתם נתיב פרטי כשיצרתם את מכונת Cloud SQL. כך BigQuery יכול לגשת לנתונים ב-Cloud SQL ולהריץ שאילתות על הנתונים האלה דרך חיבור פרטי.
המאמרים הבאים
- מידע על שאילתות מאוחדות
- מידע נוסף על מיפוי סוגי נתונים מ-MySQL ל-BigQuery
- מידע נוסף על מיפוי סוגי נתונים מ-PostgreSQL ל-BigQuery
- מידע נוסף על סוגי נתונים שלא נתמכים