טעינת נתונים מקובצי ייצוא של Firestore

ב-BigQuery אפשר לטעון נתונים מקובצי ייצוא של Firestore שנוצרו באמצעות שירות הייבוא והייצוא המנוהל של Firestore. שירות הייבוא והייצוא המנוהל מייצא מסמכי Firestore לקטגוריה של Cloud Storage. אחר כך אפשר לטעון את הנתונים שיוצאו לטבלה ב-BigQuery.

מגבלות

כשאתם טוענים נתונים ל-BigQuery מייצוא של Firestore, שימו לב למגבלות הבאות:

  • קבוצת הנתונים צריכה להיות באותו מיקום של קטגוריה של Cloud Storage שמכילה את קובצי הייצוא.
  • אפשר לציין רק URI אחד של Cloud Storage, ואי אפשר להשתמש בתו כללי לחיפוש ב-URI.
  • כדי שייצוא של Firestore ייטען בצורה נכונה, המסמכים בנתוני הייצוא צריכים להיות בעלי סכימה עקבית עם פחות מ-10,000 שמות ייחודיים של שדות.
  • אפשר ליצור טבלה חדשה לאחסון הנתונים, או להחליף טבלה קיימת. אי אפשר לצרף נתוני ייצוא של Firestore לטבלה קיימת.
  • בפקודת הייצוא צריך לציין מסנן collection-ids. אי אפשר לטעון ל-BigQuery נתונים שיוצאו בלי לציין מסנן של מזהה אוסף.

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

להקצות תפקידים של ניהול זהויות והרשאות גישה (IAM) שנותנים למשתמשים את ההרשאות הנדרשות כדי לבצע כל משימה שמופיעה במסמך הזה.

ההרשאות הנדרשות

כדי לטעון נתונים ל-BigQuery, אתם צריכים הרשאות IAM להרצת משימת טעינה ולטעינת נתונים לטבלאות ב-BigQuery ולמחיצות. אם אתם טוענים נתונים מ-Cloud Storage, אתם צריכים גם הרשאות IAM כדי לגשת לקטגוריה שמכילה את הנתונים.

הרשאות לטעינת נתונים ל-BigQuery

כדי לטעון נתונים לטבלה או למחיצה חדשה ב-BigQuery, או כדי להוסיף או להחליף טבלה או מחיצה קיימת, צריך את הרשאות ה-IAM הבאות:

  • bigquery.tables.create
  • bigquery.tables.updateData
  • bigquery.tables.update
  • bigquery.jobs.create

כל אחד מהתפקידים הבאים שמוגדרים מראש ב-IAM כולל את ההרשאות שצריך כדי לטעון נתונים לטבלה או למחיצה ב-BigQuery:

  • roles/bigquery.dataEditor
  • roles/bigquery.dataOwner
  • ‫roles/bigquery.admin (כולל את ההרשאה bigquery.jobs.create)
  • ‫bigquery.user (כולל את ההרשאה bigquery.jobs.create)
  • ‫bigquery.jobUser (כולל את ההרשאה bigquery.jobs.create)

בנוסף, אם יש לכם את ההרשאה bigquery.datasets.create, אתם יכולים ליצור ולעדכן טבלאות באמצעות משימת טעינה בקבוצות הנתונים שאתם יוצרים.

למידע נוסף על תפקידים והרשאות של IAM ב-BigQuery, קראו את המאמר תפקידים והרשאות מוגדרים מראש.

הרשאות לטעינת נתונים מ-Cloud Storage

כדי לקבל את ההרשאות שנדרשות לטעינת נתונים מקטגוריה של Cloud Storage, בקשו מהאדמין לתת לכם את התפקיד אדמין של אחסון (roles/storage.admin) ב-IAM בקטגוריה. כדי לקרוא הסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

זהו תפקיד שמוגדר מראש וכולל את ההרשאות שנדרשות לטעינת נתונים מקטגוריה של Cloud Storage. כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:

ההרשאות הנדרשות

כדי לטעון נתונים מקטגוריה של Cloud Storage, נדרשות ההרשאות הבאות:

  • storage.buckets.get
  • storage.objects.get
  • storage.objects.list (required if you are using a URI wildcard)

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

טעינת נתונים של שירות הייצוא של Firestore

אפשר לטעון נתונים מקובץ מטא-נתונים של ייצוא מ-Firestore באמצעות מסוף Google Cloud , כלי שורת הפקודה של BigQuery או API.

לפעמים משתמשים בטרמינולוגיה של Datastore במסוף Google Cloud ובכלי שורת הפקודה של BigQuery, אבל התהליכים הבאים תואמים לקובצי הייצוא של Firestore. ל-Firestore ול-Datastore יש פורמט ייצוא משותף.

המסוף

  1. נכנסים לדף BigQuery במסוף Google Cloud .

    כניסה לדף BigQuery

  2. בחלונית הימנית, לוחצים על Explorer.
  3. בחלונית Explorer, מרחיבים את הפרויקט, לוחצים על Datasets ובוחרים מערך נתונים.
  4. בקטע Dataset info, לוחצים על Create table.
  5. בחלונית Create table, מציינים את הפרטים הבאים:
    1. בקטע Source, בוחרים באפשרות Google Cloud Storage ברשימה Create table from. לאחר מכן, מבצעים את הפעולות הבאות:
      1. בוחרים קובץ מהקטגוריה של Cloud Storage או מזינים את ה-URI של Cloud Storage. אי אפשר לכלול כמה מזהי URI במסוף Google Cloud , אבל יש תמיכה בתווים כלליים לחיפוש. הקטגוריה של Cloud Storage צריכה להיות באותו מיקום כמו מערך הנתונים שמכיל את הטבלה שרוצים ליצור, להוסיף לה או להחליף אותה. ‫
        ה-URI של קובץ הייצוא של Firestore צריך להסתיים ב-KIND_COLLECTION_ID.export_metadata. לדוגמה, בנתיב default_namespace_kind_Book.export_metadata, ‏Book הוא מזהה האוסף ו-default_namespace_kind_Book הוא שם הקובץ שנוצר על ידי Firestore. אם ה-URI לא מסתיים ב-KIND_COLLECTION_ID.export_metadata, תופיע הודעת השגיאה הבאה: does not contain valid backup metadata. (קוד שגיאה: לא תקין). בחירת קובץ מקור ליצירת טבלה ב-BigQuery
      2. בשדה פורמט קובץ, בוחרים באפשרות Cloud Datastore Backup. ‫Firestore ו-Datastore משתפים את פורמט הייצוא.
    2. בקטע Destination, מציינים את הפרטים הבאים:
      1. בשדה Dataset, בוחרים את מערך הנתונים שבו רוצים ליצור את הטבלה.
      2. בשדה Table, מזינים את שם הטבלה שרוצים ליצור.
      3. מוודאים שהשדה Table type מוגדר ל-Native table.
    3. בקטע Schema, לא צריך לעשות כלום. הסכימה נגזרת מייצוא מ-Firestore.
    4. אופציונלי: מציינים את הגדרות המחיצה והאשכול. מידע נוסף זמין במאמרים יצירת טבלאות מחולקות למחיצות ויצירה של טבלאות מסודרות באשכולות ושימוש בהן.
    5. לוחצים על אפשרויות מתקדמות ומבצעים את הפעולות הבאות:
      • בשדה Write preference, משאירים את האפשרות Write if empty מסומנת. ‫This option creates a new table and loads your data into it.
      • אם רוצים להתעלם מערכים בשורה שלא קיימים בסכימה של הטבלה, בוחרים באפשרות Unknown values.
      • בקטע Encryption, לוחצים על Customer-managed key כדי להשתמש במפתח של Cloud Key Management Service. אם משאירים את ההגדרה Google-managed key, הנתונים מוצפנים במצב מנוחה ב-BigQuery.
    6. לוחצים על Create table.

BQ

משתמשים בפקודה bq load עם הערך DATASTORE_BACKUP ב-source_format. מציינים את הדגל --location ומגדירים את הערך למיקום שלכם. אם אתם מחליפים טבלה קיימת, הוסיפו את הדגל --replace.

כדי לטעון רק שדות ספציפיים, משתמשים בדגל --projection_fields.

bq --location=LOCATION load \
--source_format=FORMAT \
DATASET.TABLE \
PATH_TO_SOURCE

מחליפים את מה שכתוב בשדות הבאים:

  • ‫LOCATION: המיקום שלכם. הדגל --location הוא אופציונלי.
  • FORMAT: DATASTORE_BACKUP. ‫Datastore Backup היא האפשרות הנכונה ל-Firestore. ל-Firestore ול-Datastore יש פורמט ייצוא משותף.
  • ‫DATASET: קבוצת הנתונים שמכילה את הטבלה שאליה אתם טוענים נתונים.
  • ‫TABLE: הטבלה שאליה אתם טוענים נתונים. אם הטבלה לא קיימת, היא נוצרת.
  • ‫PATH_TO_SOURCE: ה-URI של Cloud Storage.

לדוגמה, הפקודה הבאה טוענת את קובץ הייצוא של Firestore‏ gs://mybucket/20180228T1256/default_namespace/kind_Book/default_namespace_kind_Book.export_metadata לטבלה בשם book_data. ‫mybucket ו-mydataset נוצרו במיקום US שכולל מספר אזורים.

bq --location=US load \
--source_format=DATASTORE_BACKUP \
mydataset.book_data \
gs://mybucket/20180228T1256/default_namespace/kind_Book/default_namespace_kind_Book.export_metadata

API

כדי לטעון נתוני ייצוא של Firestore באמצעות ה-API, מגדירים את המאפיינים הבאים:

  1. יוצרים הגדרת משימה ב-load שמפנה לנתוני המקור ב-Cloud Storage.

  2. מציינים את המיקום במאפיין location בקטע jobReference של משאב המשימה.

  3. השדה sourceUris צריך להיות מלא, בפורמט gs://BUCKET/OBJECT בהגדרות של משימת הטעינה. שם הקובץ (האובייקט) חייב להסתיים ב-KIND_NAME.export_metadata. אפשר להשתמש רק ב-URI אחד לייצוא של Firestore, ואי אפשר להשתמש בתו כללי לחיפוש.

  4. מציינים את פורמט הנתונים על ידי הגדרת המאפיין sourceFormat לערך DATASTORE_BACKUP בהגדרות האישיות של משימת הטעינה. ‫Datastore Backup היא האפשרות הנכונה ל-Firestore. ל-Firestore ול-Datastore יש פורמט ייצוא משותף.

  5. כדי לטעון רק שדות ספציפיים, מגדירים את המאפיין projectionFields.

  6. אם אתם מחליפים טבלה קיימת, ציינו את אופן הכתיבה על ידי הגדרת המאפיין writeDisposition לערך WRITE_TRUNCATE.

Python

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Python במדריך למתחילים של BigQuery באמצעות ספריות לקוח. למידע נוסף, קראו את מאמרי העזרה של BigQuery Python API.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

# TODO(developer): Set table_id to the ID of the table to create.
table_id = "your-project.your_dataset.your_table_name"

# TODO(developer): Set uri to the path of the kind export metadata
uri = (
    "gs://cloud-samples-data/bigquery/us-states"
    "/2021-07-02T16:04:48_70344/all_namespaces/kind_us-states"
    "/all_namespaces_kind_us-states.export_metadata"
)

# TODO(developer): Set projection_fields to a list of document properties
#                  to import. Leave unset or set to `None` for all fields.
projection_fields = ["name", "post_abbr"]

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

job_config = bigquery.LoadJobConfig(
    source_format=bigquery.SourceFormat.DATASTORE_BACKUP,
    projection_fields=projection_fields,
)

load_job = client.load_table_from_uri(
    uri, table_id, job_config=job_config
)  # Make an API request.

load_job.result()  # Waits for the job to complete.

destination_table = client.get_table(table_id)
print("Loaded {} rows.".format(destination_table.num_rows))

אפשרויות ב-Firestore

כדי לשנות את האופן שבו BigQuery מנתח את נתוני הייצוא של Firestore, צריך לציין את האפשרות הבאה:

אפשרות מסוףGoogle Cloud דגל `bq` נכס BigQuery API תיאור
לא זמין --projection_fields projectionFields (Java, Python) (אופציונלי) רשימה מופרדת בפסיקים שמציינת אילו שדות של מסמכים לטעון מייצוא של Firestore. כברירת מחדל, BigQuery טוען את כל השדות. שמות השדות הם תלויי אותיות רישיות (case-sensitive) וחייבים להופיע בייצוא. אי אפשר לציין נתיבי שדות בתוך שדה מפה כמו map.foo.

המרת סוג נתונים

‫BigQuery ממיר נתונים מכל מסמך בקובצי הייצוא של Firestore לסוגי נתונים של BigQuery. בטבלה הבאה מתוארת ההמרה בין סוגי הנתונים הנתמכים.

סוג הנתונים ב-Firestore סוג הנתונים ב-BigQuery
מערך רשומה
בוליאני בוליאני
חומרי עזר רשומה
תאריך ושעה TIMESTAMP
מפה רשומה
מספר בשיטת נקודה צפה FLOAT
נקודה גיאוגרפית

רשומה

[{"lat","FLOAT"},
 {"long","FLOAT"}]
        
מספר שלם מספר שלם
String STRING (נחתך ל-64KB)

מאפייני מפתח ב-Firestore

לכל מסמך ב-Firestore יש מפתח ייחודי שמכיל מידע כמו מזהה המסמך והנתיב שלו. ‫BigQuery יוצר סוג נתונים RECORD (שנקרא גם STRUCT) למפתח, עם שדות בתצוגת עץ לכל פריט מידע, כמו שמתואר בטבלה הבאה.

מאפיין מפתח תיאור סוג הנתונים ב-BigQuery
__key__.app שם האפליקציה ב-Firestore. מחרוזת
__key__.id מזהה המסמך, או null אם __key__.name מוגדר. מספר שלם
__key__.kind מזהה האוסף של המסמך. מחרוזת
__key__.name שם המסמך, או null אם מוגדר __key__.id. מחרוזת
__key__.namespace ב-Firestore אין תמיכה במרחבי שמות בהתאמה אישית. מרחב השמות שמוגדר כברירת מחדל מיוצג על ידי מחרוזת ריקה. מחרוזת
__key__.path הנתיב של המסמך: רצף המסמכים וזוגות האוספים מאוסף הבסיס. לדוגמה: "Country", "USA", "PostalCode", 10011, "Route", 1234. מחרוזת