ייצוא נתונים כעמודות Protobuf
במאמר הזה מוסבר איך אפשר לייצא נתונים מ-BigQuery כעמודות של Protocol Buffers (Protobuf) באמצעות פונקציות מוגדרות על ידי המשתמש (UDF) ב-BigQuery.
מתי כדאי להשתמש בעמודות Protobuf
BigQuery מציע מספר פונקציות מובנות לעיצוב נתונים נבחרים. אפשרות אחת היא למזג כמה ערכים של עמודות לערך Protobuf אחד, ויש לכך יתרונות:
- מניעת שגיאות הקלדה באובייקט.
- דחיסה משופרת, זמן העברת נתונים נמוך יותר ועלות נמוכה יותר בהשוואה ל-JSON.
- גמישות, כי לרוב שפות התכנות יש ספריות לטיפול ב-Protobuf.
- פחות תקורה כשקוראים מכמה עמודות ויוצרים אובייקט יחיד.
סוגי עמודות אחרים יכולים גם לספק מניעת שגיאות הקלדה, אבל שימוש בעמודות Protobuf מספק אובייקט עם הקלדה מלאה, שיכול לצמצם את כמות העבודה שצריך לבצע בשכבת האפליקציות או בחלק אחר של צינור הנתונים.
עם זאת, יש מגבלות על ייצוא נתונים מ-BigQuery כעמודות Protobuf:
- הוספה לאינדקס או סינון של עמודות Protobuf לא מתבצעים בצורה טובה. חיפוש לפי התוכן של עמודות ה-Protobuf עשוי להיות פחות יעיל.
- יכול להיות שיהיה קשה למיין נתונים בפורמט Protobuf.
אם המגבלות האלה חלות על תהליך העבודה של הייצוא, כדאי לשקול שיטות אחרות לייצוא נתונים מ-BigQuery:
- אפשר להשתמש בשאילתות מתוזמנות עם הצהרות
EXPORT DATAכדי למיין את הנתונים המיוצאים ב-BigQuery לפי תאריך או שעה, ולתזמן ייצוא על בסיס חוזר. BigQuery תומך בייצוא נתונים לפורמטים Avro, CSV, JSON ו-Parquet. - אפשר להשתמש ב-Dataflow כדי לייצא נתונים מ-BigQuery בפורמט קובץ Avro או CSV.
התפקידים הנדרשים
כדי לקבל את ההרשאות שדרושות לייצוא נתוני BigQuery כעמודות Protobuf, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:
-
יוצרים פונקציה להגדרת משתמש:
עריכה של נתוני BigQuery (
roles/bigquery.dataEditor) -
ייצוא נתונים מטבלה ב-BigQuery:
BigQuery Data Viewer (
roles/bigquery.dataViewer) -
קריאה והעלאה של קבצים ל-Cloud Storage:
יצירת אובייקטים באחסון (
roles/storage.objectCreator)
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
יצירת פונקציית UDF
יצירת פונקציה מוגדרת על ידי המשתמש (UDF) שממירה סוג נתונים של BigQuery STRUCTלעמודת Protobuf:
בשורת פקודה, משכפלים את מאגר
bigquery-utils.git:git clone https://github.com/GoogleCloudPlatform/bigquery-utils.gitעוברים לתיקיית הייצוא של Protobuf:
cd bigquery-utils/tools/protobuf_exportמשתמשים בפקודה
cpאו במנהל הקבצים והתיקיות של מערכת ההפעלה כדי להעתיק את קובץ ה-proto לתיקיית הצאצא./protos.כבר קיים קובץ proto לדוגמה בשם
dummy.protoבתיקייה./protos.מתקינים את החבילות הנדרשות ממאגר GitHub:
npm installיוצרים חבילה של הקבצים באמצעות webpack:
npx webpack --config webpack.config.js --stats-error-detailsמאתרים את הקובץ
pbwrapper.jsבתיקיית הצאצא./distואז מעלים את הקובץ לקטגוריה של Cloud Storage.עוברים לדף BigQuery.
בעזרת עורך השאילתות, יוצרים UDF בשם
toMyProtoMessageשבונה עמודת Protobuf מעמודות קיימות בטבלה ב-BigQuery:CREATE FUNCTION DATASET_ID.toMyProtoMessage(input STRUCT<INPUT_FIELDS>) RETURNS BYTES LANGUAGE js OPTIONS ( library=["gs://BUCKET_NAME/pbwrapper.js"] ) AS r""" let message = pbwrapper.setup("PROTO_PACKAGE.PROTO_MESSAGE") return pbwrapper.parse(message, input) """;מחליפים את מה שכתוב בשדות הבאים:
-
DATASET_ID: המזהה של מערך הנתונים שאמור להכיל את הפונקציה המוגדרת על ידי המשתמש.
INPUT_FIELDS: השדות שמשמשים בסוג הודעת הפרוטו של קובץ הפרוטו, בפורמטfield_name_1 field_type_1 [, field_name_2 field_type_2, ...].צריך לתרגם את כל השדות של סוג ההודעה שמשתמשים בקו תחתון, כך שבמקום זאת ישתמשו באותיות רישיות לסירוגין. לדוגמה, אם סוג ההודעה נראה כך, ערך שדות הקלט צריך להיות
itemId int64, itemDescription string:message ThisMessage { int64 item_id = 1; string item_description = 2; }
BUCKET_NAME: שם הקטגוריה ב-Cloud Storage שמכילה את הקובץpbwrapper.js.
PROTO_PACKAGE: החבילה של קובץ ה-proto.
PROTO_MESSAGE: סוג ההודעה בקובץ הפרוטו.
לדוגמה, אם משתמשים בקובץ
dummy.protoשסופק, ההצהרהCREATE FUNCTIONנראית כך:CREATE OR REPLACE FUNCTION mydataset.toMyProtoMessage(input STRUCT<dummyField STRING>) RETURNS BYTES LANGUAGE js OPTIONS ( library=["gs://mybucket/pbwrapper.js"] ) AS r""" let message = pbwrapper.setup("dummypackage.DummyMessage") return pbwrapper.parse(message, input) """;-
עיצוב עמודות כערכי Protobuf
מריצים את הפונקציה toMyProtoMessage UDF כדי לעצב את העמודות בטבלת BigQuery כערכי Protobuf:
SELECT
UDF_DATASET_ID.toMyProtoMessage(STRUCT(INPUT_COLUMNS)) AS protoResult
FROM
`PROJECT_ID.DATASET_ID.TABLE_NAME`
LIMIT
100;
מחליפים את מה שכתוב בשדות הבאים:
-
UDF_DATASET_ID: המזהה של מערך הנתונים שמכיל את פונקציית ה-UDF. -
INPUT_COLUMNS: שמות העמודות שרוצים לעצב כערך Protobuf, בפורמטcolumn_name_1 [, column_name_2, ...]. העמודות יכולות להיות מכל סוג ערך סקלרי נתמך או מסוג לא סקלרי, כוללARRAYו-STRUCT. עמודות הקלט צריכות להתאים לסוג ולמספר של השדות בסוג הודעת הפרוטו. -
PROJECT_ID: מזהה הפרויקט שמכיל את הטבלה. אפשר לדלג על זיהוי הפרויקט אם מערך הנתונים נמצא בפרויקט הנוכחי. -
DATASET_ID: המזהה של מערך הנתונים שמכיל את הטבלה. -
TABLE_NAME: שם הטבלה שמכילה את העמודות שרוצים לעצב.
לדוגמה, אם משתמשים ב-toMyProtoMessage UDF שמבוסס על dummy.proto, אפשר להשתמש בהצהרת SELECT הבאה:
SELECT
mydataset.toMyProtoMessage(STRUCT(word)) AS protoResult
FROM
`bigquery-public-data.samples.shakespeare`
LIMIT 100;
עבודה עם ערכי Protobuf
אחרי ייצוא הנתונים בפורמט Protobuf ל-BigQuery, אפשר לעבוד עם הנתונים כאובייקט או כמבנה עם הקלדה מלאה.
בדוגמאות הקוד הבאות אפשר לראות כמה דרכים לעיבוד הנתונים המיוצאים או לעבודה איתם: