ייצוא נתונים כעמודות Protobuf
פונקציות בהגדרת המשתמש (UDF) ב-BigQuery מאפשרות לייצא נתונים כעמודות של מאגרי אחסון לפרוטוקולים (Protobuf). עמודות Protobuf מספקות לאפליקציות אובייקטים עם סוגים מוגדרים, ויכולות להקטין את גודל הנתונים, את זמן ההעברה ואת העלות בהשוואה ל-JSON.
מתי כדאי להשתמש בעמודות 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 (
roles/bigquery.dataViewer) -
קריאה והעלאה של קבצים לאחסון בענן: יוצר אובייקטי אחסון (
roles/storage.objectCreator)
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
יצירת פונקציה בהגדרת משתמש (UDF)
יוצרים פונקציה מוגדרת-משתמש שממירה סוג נתונים STRUCT של BigQuery לעמודת Protobuf:
בשורת הפקודה, משכפלים את המאגר
bigquery-utils.git:git clone https://github.com/GoogleCloudPlatform/bigquery-utils.gitעוברים לתיקיית הייצוא של Protobuf:
cd bigquery-utils/tools/protobuf_exportמשתמשים בפקודה
cpאו בדפדפן הקבצים של מערכת ההפעלה כדי להעתיק את קובץ ה-proto לתיקיית המשנה./protos.בתיקייה
./protosכבר יש קובץ .proto לדוגמה בשםdummy.proto.מתקינים את החבילות הנדרשות מהמאגר ב-GitHub:
npm installמקבצים את החבילה באמצעות webpack:
npx webpack --config webpack.config.js --stats-error-detailsמאתרים את הקובץ
pbwrapper.jsבתיקיית המשנה./distומעלים את הקובץ לקטגוריה של Cloud Storage.נכנסים לדף BigQuery.
בעורך השאילתות, יוצרים פונקציה מוגדרת-משתמש בשם
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: המזהה של קבוצת הנתונים שתכיל את ה-UDF.
INPUT_FIELDS: השדות שמשמשים בסוג ההודעה של הפרוטוקול בקובץ .proto, בפורמט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: סוג ההודעה של קובץ ה-proto.
לדוגמה, אם משתמשים בקובץ
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 כדי להגדיר את הפורמט של העמודות בטבלה ב-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. עמודות הקלט חייבות להתאים לסוג ולמספר של השדות של סוג ההודעה ב-proto. -
PROJECT_ID: מזהה הפרויקט שמכיל את הטבלה. אם מערך הנתונים נמצא בפרויקט הנוכחי, אתם יכולים לדלג על זיהוי הפרויקט. -
DATASET_ID: המזהה של קבוצת הנתונים שמכילה את הטבלה. -
TABLE_NAME: שם הטבלה שמכילה את העמודות שרוצים לעצב.
לדוגמה, אם משתמשים ב-UDF ב-toMyProtoMessage שמבוססת על dummy.proto, הצהרת ה-SELECT הבאה תעבוד:
SELECT
mydataset.toMyProtoMessage(STRUCT(word)) AS protoResult
FROM
`bigquery-public-data.samples.shakespeare`
LIMIT 100;
עבודה עם ערכי Protobuf
אחרי שמייצאים את הנתונים מ-BigQuery בפורמט Protobuf, אפשר לעבוד איתם כאובייקט או כמבנה (struct) עם סוג מוגדר.
בדוגמאות הקוד הבאות אפשר לראות כמה דרכים לעבד את הנתונים שיוצאו או לעבוד איתם: