ייצוא נתונים ל-Bigtable (תהליך ETL הפוך)

חילוץ, טרנספורמציה וטעינה (ETL) הפוכים מ-BigQuery ל-Bigtable מאפשרים לשלב ניתוח נתונים ב-BigQuery עם זמן אחזור קצר ותפוקה גבוהה ב-Bigtable. אתם יכולים להציג נתונים למשתמשי האפליקציה בלי לחרוג מהמכסות ומהמגבלות ב-BigQuery.

כדי להגדיר את תהליך העבודה הזה, משתמשים בהצהרת EXPORT DATA כדי לייצא נתונים מטבלה ב-BigQuery לטבלה ב-Bigtable.

מאפיינים של טבלאות Bigtable

טבלאות Bigtable שונות מטבלאות ב-BigQuery בכמה דרכים:

  • גם טבלאות Bigtable וגם טבלאות BigQuery מורכבות משורות, אבל שורה ב-Bigtable מורכבת ממפתח שורה ומקבוצות של עמודות, עם מספר שרירותי של עמודות ששייכות לאותה קבוצת עמודות.
  • קבוצות העמודות של טבלה מסוימת נוצרות בזמן יצירת הטבלה, אבל אפשר גם להוסיף או להסיר אותן מאוחר יותר. כשיוצרים קבוצת עמודות, לא צריך לציין את העמודות ששייכות לה.
  • לא צריך להגדיר מראש את העמודות ב-Bigtable, ואפשר להשתמש בהן כדי לאחסן נתונים בשם שלהן (שנקרא גם מזהה) במסגרת מגבלות הגודל של הנתונים בטבלאות.
  • לעמודות ב-Bigtable יכול להיות כל ערך בינארי, כל עוד הוא לא חורג ממגבלות גודל הנתונים בטבלאות.
  • לעמודות ב-Bigtable תמיד יש ממד זמני (שנקרא גם גרסה). אפשר לאחסן כל מספר של ערכים בכל שורה באותה עמודה, כל עוד חותמת הזמן לא זהה.
  • חותמת הזמן של Bigtable נמדדת במיקרו-שניות מאז ראשית זמן יוניקס (Unix epoch) – לדוגמה, 0 מייצג את 1970-01-01T00:00:00 UTC. חותמות הזמן חייבות להיות מספר חיובי של מיקרו-שניות ברמת פירוט של אלפיות השנייה (רק כפולות של 1,000 מיקרו-שניות). חותמת הזמן שמוגדרת כברירת מחדל ב-Bigtable היא 0.
  • הנתונים ב-Bigtable נקראים לפי מפתח שורה, כמה מפתחות שורה, טווח של מפתחות שורה או באמצעות מסנן. בכל סוגי בקשות הקריאה, למעט סריקה מלאה של הטבלה, צריך לציין לפחות מפתח שורה אחד או טווח של מפתחות שורות.

במאמר הכנת תוצאות של שאילתות לייצוא מוסבר איך מכינים את התוצאות של BigQuery לייצוא ל-Bigtable.

לפני שמתחילים

התפקידים הנדרשים

כדי לקבל את ההרשאות שדרושות לייצוא נתוני BigQuery ל-Bigtable, בקשו מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:

להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.

מגבלות

שיקולים בקשר למיקום

  • אם מערך הנתונים ב-BigQuery נמצא במספר אזורים, צריך להגדיר את פרופיל האפליקציה ב-Bigtable כך שינתב את הנתונים לאשכול Bigtable שנמצא באותם אזורים. לדוגמה, אם מערך הנתונים ב-BigQuery נמצא במספר אזורים ב-US, אשכול Bigtable יכול להיות באזור us-west1 (אורגון), שנמצא בארצות הברית.
  • אם מערך הנתונים ב-BigQuery נמצא באזור אחד, צריך להגדיר את פרופיל האפליקציה ב-Bigtable כך שינתב את הנתונים לאשכול Bigtable באותו אזור. לדוגמה, אם מערך הנתונים ב-BigQuery נמצא באזור asia-northeast1 (טוקיו), גם אשכול Bigtable צריך להיות באזור asia-northeast1 (טוקיו).

מידע נוסף זמין במאמר מיקומים של Bigtable.

סוגי BigQuery נתמכים

אפשר לכתוב ל-Bigtable את סוגי הנתונים הבאים:

סוג BigQuery ערך Bigtable שנכתב
BYTES מיוצאים כמו שהם.
STRING בוצעה המרה ל-BYTES.
INTEGER אם הערך של bigtable_options.column_families.encoding הוא BINARY, הערך נכתב בפורמט big-endian של 8 בייטים (הבייט המשמעותי ביותר בהתחלה). אם bigtable_options.column_families.encoding מוגדר כ-TEXT, הערך נכתב כמחרוזת קריאה לאנשים שמייצגת מספר.
FLOAT כותב ערך בפורמט פלט של 8 בייטים לפי תקן IEEE 754.
BOOLEAN אם bigtable_options.column_families.encoding מוגדר כ-BINARY, הערך נכתב כערך של בייט אחד (false = 0x00 או true = 0x01). אם bigtable_options.column_families.encoding מוגדר ל-TEXT, הערך נכתב כטקסט ("true" או "false").
JSON
עמודה מיוצאת מסוג JSON מפורשת כקבוצת עמודות ששייכת למשפחת עמודות ספציפית ב-Bigtable. האיברים של אובייקט ה-JSON מפורשים כעמודות, והערכים שלהם נכתבים ב-Bigtable. אפשר לשנות את שם העמודה שתיכתב באמצעות ההגדרה bigtable_options.

לדוגמה:
    JSON '{"FIELD1": "VALUE1", "FIELD2": "VALUE2"}' as MY_COLUMN_FAMILY
    
כאשר הערכים VALUE1 ו-VALUE2 נכתבים ב-Bigtable כעמודות FIELD1 ו-FIELD2 לקבוצת העמודות MY_COLUMN_FAMILY.
STRUCT
עמודה מיוצאת מסוג STRUCT מפורשת כקבוצת עמודות ששייכת למשפחת עמודות ספציפית ב-Bigtable. האיברים של המבנה מפורשים כעמודות והערכים שלהם נכתבים ב-Bigtable. אפשר לשנות את שם העמודה שתיכתב באמצעות ההגדרה bigtable_options.

לדוגמה:
    STRUCT<FIELD1  STRING, FIELD2 INTEGER> as MY_COLUMN_FAMILY
    
כאשר הערכים FIELD1 ו-FIELD2 נכתבים ב-Bigtable כעמודות FIELD1 ו-FIELD2 לקבוצת העמודות MY_COLUMN_FAMILY.

סוגי הנתונים הנתמכים האלה דומים לקריאה מטבלאות Bigtable חיצוניות ב-BigQuery.

ערכי NULL ב-Bigtable

לערכים של NULL ב-Bigtable יש את המגבלות הבאות:

  • ב-Bigtable אין ערכים מקבילים לערכי NULL. כשמייצאים ערך NULL לקבוצת עמודות ולעמודה נתונות ב-Bigtable, הערכים הנוכחיים נמחקים משורה ב-Bigtable.

  • אם ערך של Bigtable עם מפתח שורה, קבוצת עמודות, מגדיר עמודה וחותמת זמן נתונים לא קיים לפני הייצוא, לערכי NULL שיוצאו אין השפעה על השורה ב-Bigtable.

  • כשמייצאים ערך NULL מסוג STRUCT או JSON, כל ערכי העמודות ששייכים לקבוצת העמודות התואמת של השורה המושפעת נמחקים. כדי שמנוע ה-SQL יצרף את הסוג הנכון, צריך להמיר את הערך NULL לסוג STRUCT או JSON. השאילתה הבאה מוחקת את כל הנתונים מקבוצת העמודות column_family1 עם קבוצה של מפתחות שורות נתונים:

    EXPORT DATA OPTIONS (...) AS
    SELECT
      rowkey,
    CAST(NULL as STRUCT<INT64>) AS column_family1 FROM T
  • שורות עם מפתחות שורה מסוג NULL לא נכללות בייצוא. מספר השורות שדילגו עליהן מוחזר בנתונים הסטטיסטיים של הייצוא לפונקציית קריאה חוזרת (caller).

הגדרת ייצוא באמצעות bigtable_options

אתם יכולים להשתמש בהגדרה bigtable_options במהלך הייצוא כדי לגשר על ההבדלים בין מודלי האחסון של BigQuery ו-Bigtable. ההגדרה מבוטאת בצורה של מחרוזת JSON, כמו בדוגמה הבאה:

EXPORT DATA OPTIONS(
   uri="https://bigtable.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/appProfiles/APP_PROFILE_ID/tables/TABLE",
   bigtable_options = """{
     "columnFamilies": [{
       "familyId": "COLUMN_FAMILY_NAME",
       "encoding": "ENCODING_VALUE",
       "columns": [
         {
           "qualifierString": "BIGTABLE_COLUMN_QUALIFIER",
           ["qualifierEncoded": "BASE_64_ENCODED_VALUE",]
           "fieldName": "BIGQUERY_RESULT_FIELD_NAME"
         }
       ]
    }]
   }"""
)

בטבלה הבאה מתוארים השדות האפשריים שמשמשים להגדרת bigtable_options:

שם השדה תיאור
columnFamilies מערך של מתארי קבוצות עמודות.
columnFamilies.familyId המזהה של קבוצת העמודות ב-Bigtable.
columnFamilies.encoding אפשר להגדיר את הערך ל-BINARY או ל-TEXT. במאמר סוגי BigQuery נתמכים מוסבר איך הסוגים מקודדים.
columnFamilies.columns מערך של מיפוי עמודות ב-Bigtable.
columnFamilies.columns.qualifierString אופציונלי: מגדיר עמודה ב-Bigtable. ציינו את הערך הזה אם למגדיר העמודה אין קודים שאינם UTF-8. השדות qualifierString ו-qualifierEncoding לא יכולים להתקיים בו-זמנית. אם לא צוינו qualifierString וגם לא qualifierEncoded, המערכת תשתמש ב-fieldName בתור מגדיר העמודה.
columnFamilies.columns.qualifierEncoded אופציונלי: מגדיר עמודה בקידוד Base64. דומה ל-qualifierString, למקרה שמגדיר העמודה חייב לכלול קודים שאינם ב-UTF-8.
columnFamilies.columns.fieldName חובה: שם השדה של קבוצת התוצאות ב-BigQuery. במקרים מסוימים, יכול להיות מחרוזת ריקה. במאמר הכנת תוצאות של שאילתות לייצוא מופיעה דוגמה לשימוש בערך fieldName ריק בשדות מסוגים פשוטים.

הכנת תוצאות השאילתה לייצוא

כדי לייצא תוצאות של שאילתות ל-Bigtable, התוצאות צריכות לעמוד בדרישות הבאות:

  • קבוצת התוצאות חייבת להכיל עמודה rowkey מסוג STRING או BYTES.
  • מפתחות שורות, מגדירי עמודות, ערכים וחותמות זמן לא יכולים לחרוג ממגבלות גודל הנתונים בטבלאות של Bigtable.
  • צריך להיות לפחות עמודה אחת חוץ מ-rowkey בקבוצת התוצאות.
  • כל עמודה בקבוצת התוצאות חייבת להיות מאחד מסוגי הנתונים הנתמכים ב-BigQuery. לפני הייצוא ל-Bigtable, צריך להמיר את כל סוגי העמודות שלא נתמכים לאחד מהסוגים הנתמכים.

ב-Bigtable, מגדירי העמודות לא חייבים להיות שמות תקינים של עמודות ב-BigQuery, ואפשר להשתמש בכל בייט. במאמר הגדרת ייצוא באמצעות bigtable_options מוסבר איך לשנות את מגדירי העמודות של היעד בייצוא.

אם אתם משתמשים בערכים שיוצאו עם ממשקי API של Bigtable, כמו ReadModifyWriteRow, כל הערכים המספריים צריכים להשתמש בקידוד הבינארי הנכון.

כברירת מחדל, עמודות תוצאה עצמאיות מסוגים שאינם STRUCT או JSON מפורשות כערכים של משפחות עמודות יעד ששוות לשם עמודת התוצאה, ומגדיר העמודה שווה למחרוזת ריקה.

כדי להדגים איך סוגי הנתונים האלה נכתבים, נתבונן בדוגמה הבאה של SQL, שבה column ו-column2 הן עמודות תוצאות נפרדות:

SELECT
  x as column1, y as column2
FROM table

בשאילתה לדוגמה, SELECT x as column1 כותב ערכים ל-Bigtable בקבוצת העמודות column1 ובמגדיר העמודה '' (מחרוזת ריקה) כשמטפלים בסוגים שאינם JSON או STRUCT.

אפשר לשנות את האופן שבו הסוגים האלה נכתבים בייצוא באמצעות ההגדרה bigtable_options, כמו בדוגמה הבאה:

EXPORT DATA OPTIONS (
  …
  bigtable_options="""{
   "columnFamilies" : [
      {
        "familyId": "ordered_at",
        "columns": [
           {"qualifierString": "order_time", "fieldName": ""}
        ]
      }
   ]
}"""
) AS
SELECT
  order_id as rowkey,
  STRUCT(product, amount) AS sales_info,
  EXTRACT (MILLISECOND FROM order_timestamp AT TIME ZONE "UTC") AS ordered_at
FROM T

בדוגמה הזו, הטבלה T ב-BigQuery מכילה את השורה הבאה:

order_id order_timestamp product amount
101 2023-03-28T10:40:54Z ג'ויסטיק 2

אם משתמשים בהגדרת bigtable_options הקודמת עם הטבלה T, הנתונים הבאים נכתבים ב-Bigtable:

rowkey sales_info (קבוצת עמודות) ordered_at (קבוצת עמודות)
101 מוצר סכום order_time
1970-01-01T00:00:00Z ג'ויסטיק 1970-01-01T00:00:00Z 2 1680000054000

‫1680000054000 מייצג את 2023-03-28T10:40:54Z באלפיות השנייה מאז ראשית זמן יוניקס (Unix epoch) באזור הזמן UTC.

יצירה אוטומטית של קבוצות עמודות חדשות

כדי ליצור באופן אוטומטי קבוצות עמודות חדשות בטבלה של Bigtable, מגדירים את האפשרות auto_create_column_families בהצהרה EXPORT DATA לערך true. כדי להשתמש באפשרות הזו נדרשת ההרשאה bigtable.tables.update, שכלולה בתפקידים כמו Bigtable Administrator‏ (roles/bigtable.admin).

EXPORT DATA OPTIONS (
uri="https://bigtable.googleapis.com/projects/PROJECT-ID/instances/INSTANCE-ID/appProfiles/APP_PROFILE_ID/tables/TABLE",
format="CLOUD_BIGTABLE",
auto_create_column_families = true
) AS
SELECT
  order_id as rowkey,
  STRUCT(product, amount) AS sales_info
FROM T

הגדרת חותמת זמן לכל התאים בשורה באמצעות _CHANGE_TIMESTAMP

אפשר להוסיף לתוצאה עמודה _CHANGE_TIMESTAMP מסוג TIMESTAMP כדי לייצא אותה. כל תא שנכתב ב-Bigtable משתמש בערך חותמת הזמן מהשדה _CHANGE_TIMESTAMP של שורת התוצאות שיוצאה.

‫Bigtable לא תומך בחותמות זמן שמוקדמות יותר מראשית זמן יוניקס (Unix epoch) ‏(‎1970-01-01T00:00:00Z). אם הערך של _CHANGE_TIMESTAMP הוא NULL, זמן ראשית זמן יוניקס (Unix epoch) של 0 משמש כערך ברירת המחדל של חותמת הזמן.

השאילתה הבאה כותבת תאים לעמודות product ו-amount עם חותמת הזמן שצוינה בעמודה order_timestamp של הטבלה T.

EXPORT DATA OPTIONS (...) AS
SELECT
  rowkey,
  STRUCT(product, amount) AS sales_info,
  order_timestamp as _CHANGE_TIMESTAMP
FROM T

ייצוא רציף

אם אתם רוצים לעבד שאילתת ייצוא באופן רציף, אתם יכולים להגדיר אותה כשאילתה מתמשכת.

ייצוא של כמה תוצאות עם אותו ערך rowkey

כשמייצאים תוצאה שמכילה כמה שורות עם אותו ערך rowkey, הערכים שנכתבים ב-Bigtable מגיעים לאותה שורה ב-Bigtable.

אתם יכולים להשתמש בשיטה הזו כדי ליצור כמה גרסאות של ערכי עמודות באותה שורה. בדוגמה הזו, הטבלה orders ב-BigQuery מכילה את הנתונים הבאים:

id customer order_timestamp amount_spent
100 בוב 2023-01-01T10:10:54Z 10.99
101 אליס 2023-01-02T12:10:50Z 102.7
102 בוב 2023-01-04T15:17:01Z ‫11.1

לאחר מכן המשתמש מריץ את הצהרת ה-EXPORT DATA הבאה:

EXPORT DATA OPTIONS (
uri="https://bigtable.googleapis.com/projects/PROJECT-ID/instances/INSTANCE-ID/appProfiles/APP_PROFILE_ID/tables/TABLE",
format="CLOUD_BIGTABLE"
) AS
SELECT customer as rowkey, STRUCT(amount_spent) as orders_column_family, order_timestamp as _CHANGE_TIMESTAMP
FROM orders

אם משתמשים בהצהרה הזו עם הטבלה orders ב-BigQuery, הנתונים הבאים נכתבים ב-Bigtable:

orders_column_family
מפתח שורה amount_spent
אליס 2023-01-02T12:10:50Z 102.7
בוב 2023-01-01T10:10:54Z 10.99
2023-01-04T15:17:01Z ‫11.1

כשמייצאים ל-Bigtable, ערכים חדשים מתמזגים בטבלה במקום להחליף שורות שלמות. אם כבר קיימים ערכים ב-Bigtable למפתח שורה, ערכים חדשים יכולים להחליף באופן חלקי או מלא ערכים קודמים, בהתאם למשפחת העמודות, לשמות העמודות ולחותמות הזמן של התאים שנכתבים.

ייצוא של כמה עמודות כערכים של מאגר אחסון לפרוטוקולים (Protobuf)

מאגרי אחסון לפרוטוקולים מספקים מנגנון גמיש ויעיל לסריאליזציה של נתונים מובְנים. ייצוא כ-Protobuf יכול להיות שימושי, בהתחשב באופן שבו סוגים שונים מטופלים בין BigQuery ל-Bigtable. אתם יכולים להשתמש בפונקציות בהגדרת המשתמש (UDF) ב-BigQuery כדי לייצא נתונים כערכים בינאריים של Protobuf ל-Bigtable. מידע נוסף זמין במאמר ייצוא נתונים כעמודות Protobuf.

אופטימיזציה של הייצוא

כדי לשנות את קצב העברת הרשומות שמיוצאות מ-BigQuery ל-Bigtable, אפשר לשנות את מספר הצמתים באשכול היעד ב-Bigtable. קצב העברת הנתונים (שורות שנכתבות בשנייה) משתנה באופן לינארי בהתאם למספר הצמתים באשכול היעד. לדוגמה, אם תכפילו את מספר הצמתים באשכול היעד, קצב העברת הנתונים בייצוא יוכפל בערך.

תמחור

כשמייצאים נתונים בשאילתה רגילה, החיוב מתבצע לפי תמחור חילוץ הנתונים. כשמייצאים נתונים בשאילתה מתמשכת, החיוב מתבצע לפי תמחור המחשוב של קיבולת BigQuery. כדי להריץ שאילתות מתמשכות, צריך הזמנה שמשתמשת במהדורת Enterprise או Enterprise Plus, והקצאת הזמנה שמשתמשת בסוג המשימה CONTINUOUS.

אחרי ייצוא הנתונים, תחויבו על אחסון הנתונים ב-Bigtable. מידע נוסף על התמחור ב-Bigtable