יצירת טבלאות חיצוניות של Apache Iceberg
טבלאות חיצוניות של Apache Iceberg מאפשרות לכם לגשת לטבלאות Apache Iceberg בפורמט לקריאה בלבד, עם בקרת גישה ברמה מפורטת יותר, כולל אבטחה ברמת השורה וברמת העמודה ואנונימיזציה של נתונים. הטבלאות האלה כבר לא מומלצות לרוב התרחישים לדוגמה. במקום זאת, עיינו בחלופות המומלצות.
חלופות מומלצות
בהתאם למקום שבו הנתונים מאוחסנים, אנחנו ממליצים על החלופות הבאות כדי לגשת לטבלאות Iceberg שהמטא-נתונים שלהן לא מנוהלים על ידיGoogle Cloud:
- נתונים ב-Cloud Storage או ב-Amazon Simple Storage Service (Amazon S3) שמנוהלים על ידי קטלוגים מרוחקים כמו AWS Glue, Databricks Unity Catalog ו-Snowflake Horizon Catalog. שימוש בקטלוג ייעודי לזמן ריצה של Lakehouse עם גישה לנתונים חוצי-עננים. התכונה "גישה לנתונים חוצי-עננים" בקטלוג הייעודי לזמן ריצה של Lakehouse מאפשרת לשלוח שאילתות לגבי נתונים בספקי שירותי ענן אחרים ישירות מ- Google Cloud , בלי להעביר קבצים או ליצור צינורות עיבוד נתונים מורכבים של ETL.
- טבלאות Azure Blob Storage או Apache Iceberg שלא מנוהלות על ידי קטלוג מרוחק נתמך לקטלוג ייעודי לזמן ריצה של Lakehouse עם גישה לנתונים חוצי-עננים. ממשיכים עם טבלאות חיצוניות של Apache Iceberg באמצעות קובצי מטא-נתונים של Iceberg JSON.
תמיכה בפורמט ובגרסה של Iceberg
Iceberg הוא פורמט טבלה בקוד פתוח שתומך בטבלאות נתונים בקנה מידה של פטה-בייט. המפרט הפתוח של Iceberg מאפשר להריץ כמה מנועי שאילתות על עותק אחד של נתונים שמאוחסנים במאגר אובייקטים. טבלאות חיצוניות של Iceberg תומכות ב-Iceberg גרסה 2, כולל מיזוג בקריאה. התמיכה ב-Iceberg גרסה 3, כולל וקטורים של מחיקה בינארית, נמצאת בגרסת טרום-השקה (Preview). כדי לשלוח משוב או לשאול שאלות שקשורות לתכונה הזו בגרסת טרום-השקה (Preview), אפשר לפנות אל biglake-help@google.com.
לפני שמתחילים
מפעילים את BigQuery Connection API ואת BigQuery Reservation API, אם הם עדיין לא מופעלים.
התפקידים שנדרשים כדי להפעיל ממשקי API
כדי להפעיל ממשקי API, צריך את ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד "בעלים" (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד "אדמין בממשק 'שימוש בשירות'" (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים
אם אתם משתמשים בפרוצדורה מאוחסנת של Spark ב-BigQuery כדי ליצור טבלאות חיצוניות של Iceberg, אתם צריכים לפעול לפי השלבים הבאים:
כדי לאחסן את המטא-נתונים ואת קובצי הנתונים של הטבלה החיצונית של Iceberg ב-Cloud Storage, יוצרים קטגוריה של Cloud Storage. כדי לגשת לקובצי המטא-נתונים, צריך להתחבר לקטגוריה של Cloud Storage. כדי לעשות את זה:
התפקידים הנדרשים
כדי לקבל את ההרשאות שדרושות ליצירת טבלה חיצונית של Iceberg, בקשו מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:
- אדמין ב-BigQuery (
roles/bigquery.admin) - אדמין של אובייקטים באחסון (
roles/storage.objectAdmin)
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
התפקידים המוגדרים מראש האלה מכילים את ההרשאות שנדרשות כדי ליצור טבלה חיצונית של Iceberg. כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:
ההרשאות הנדרשות
כדי ליצור טבלה חיצונית של Iceberg, נדרשות ההרשאות הבאות:
-
bigquery.tables.create -
bigquery.connections.delegate -
bigquery.jobs.create
יכול להיות שתקבלו את ההרשאות האלה באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.
יצירת טבלאות באמצעות קובץ מטא-נתונים
אפשר ליצור טבלאות חיצוניות של Iceberg באמצעות קובץ מטא-נתונים בפורמט JSON. עם זאת, צריך לעדכן ידנית את ה-URI של קובץ המטא-נתונים בפורמט JSON כדי שהטבלה החיצונית של Iceberg תישאר עדכנית. אם לא מעדכנים את ה-URI, יכול להיות שהשאילתות ב-BigQuery ייכשלו או יחזירו תוצאות שונות ממנועי שאילתות אחרים שמשתמשים ישירות בקטלוג Iceberg.
קובצי המטא-נתונים של טבלת Iceberg נוצרים בקטגוריה של Cloud Storage שציינתם כשאתם יוצרים טבלת Iceberg באמצעות Spark.
בוחרים באחת מהאפשרויות הבאות:
SQL
משתמשים בהצהרה CREATE EXTERNAL TABLE. בדוגמה הבאה נוצרת טבלה חיצונית של Iceberg בשם myexternal-table:
CREATE EXTERNAL TABLE myexternal-table
WITH CONNECTION `myproject.us.myconnection`
OPTIONS (
format = 'ICEBERG',
uris = ["gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json"]
)
מחליפים את הערך uris בקובץ המטא-נתונים העדכני ביותר בפורמט JSON של תמונת מצב ספציפית של טבלה.
כדי להפעיל את מסנן המחיצה הנדרש, מגדירים את הדגל require_partition_filter.
BQ
בסביבת שורת הפקודה, משתמשים בפקודה bq mk --table עם ה-decorator @connection כדי לציין את החיבור שבו רוצים להשתמש בסוף הפרמטר --external_table_definition.
כדי להפעיל את דרישת מסנן המחיצה, משתמשים ב---require_partition_filter.
bq mk
--table
--external_table_definition=TABLE_FORMAT=URI@projects/CONNECTION_PROJECT_ID/locations/CONNECTION_REGION/connections/CONNECTION_ID
PROJECT_ID:DATASET.EXTERNAL_TABLE
מחליפים את מה שכתוב בשדות הבאים:
TABLE_FORMAT: הפורמט של הטבלה שרוצים ליצורבמקרה הזה,
ICEBERG.
URI: קובץ המטא-נתונים העדכני בפורמט JSON של תמונת מצב ספציפית של טבלה.לדוגמה,
gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json.ה-URI יכול להפנות גם למיקום חיצוני בענן, כמו Amazon S3 או Azure Blob Storage.
- דוגמה ל-AWS:
s3://mybucket/iceberg/metadata/1234.metadata.json. - דוגמה ל-Azure:
azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json.
- דוגמה ל-AWS:
CONNECTION_PROJECT_ID: הפרויקט שמכיל את החיבור ליצירת הטבלה החיצונית של Iceberg, לדוגמהmyproject
CONNECTION_REGION: האזור שבו נמצא החיבור ליצירת הטבלה החיצונית של Iceberg, לדוגמהus
CONNECTION_ID: מזהה החיבור לטבלה, לדוגמהmyconnectionכשמציגים את פרטי החיבור במסוף Google Cloud , מזהה החיבור הוא הערך בחלק האחרון של מזהה החיבור המלא שמוצג ב-Connection ID, לדוגמה
projects/myproject/locations/connection_location/connections/myconnection.
DATASET: השם של מערך הנתונים ב-BigQuery שבו רוצים ליצור טבלהלדוגמה,
mydataset.
EXTERNAL_TABLE: שם הטבלה שרוצים ליצורלדוגמה,
mytable.
עדכון המטא-נתונים של הטבלה
אם אתם משתמשים בקובץ מטא-נתונים בפורמט JSON כדי ליצור טבלה חיצונית של Iceberg, אתם צריכים לעדכן את הגדרת הטבלה למטא-נתונים העדכניים ביותר של הטבלה. כדי לעדכן את הסכימה או את קובץ המטא-נתונים, בוחרים באחת מהאפשרויות הבאות:
BQ
יוצרים קובץ הגדרת טבלה:
bq mkdef --source_format=ICEBERG \ "URI" > TABLE_DEFINITION_FILE
משתמשים בפקודה
bq updateעם הדגל--autodetect_schema:bq update --autodetect_schema --external_table_definition=TABLE_DEFINITION_FILE PROJECT_ID:DATASET.TABLE
מחליפים את מה שכתוב בשדות הבאים:
URI: ה-URI של Cloud Storage עם קובץ המטא-נתונים העדכני בפורמט JSONלדוגמה,
gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json.
TABLE_DEFINITION_FILE: שם הקובץ שמכיל את סכימת הטבלה
PROJECT_ID: מזהה הפרויקט שמכיל את הטבלה שרוצים לעדכן
DATASET: קבוצת הנתונים שמכילה את הטבלה שרוצים לעדכן
TABLE: הטבלה שרוצים לעדכן
API
משתמשים ב-method tables.patch כשהמאפיין autodetect_schema מוגדר לערך true:
PATCH https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET/tables/TABLE?autodetect_schema=true
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה הפרויקט שמכיל את הטבלה שרוצים לעדכן -
DATASET: קבוצת הנתונים שמכילה את הטבלה שרוצים לעדכן -
TABLE: הטבלה שרוצים לעדכן
בגוף הבקשה, מציינים את הערכים המעודכנים בשדות הבאים:
{
"externalDataConfiguration": {
"sourceFormat": "ICEBERG",
"sourceUris": [
"URI"
]
},
"schema": null
}'
מחליפים את URI בקובץ המטא-נתונים העדכני של Iceberg. לדוגמה, gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json.
הגדרת כללי מדיניות של בקרת גישה
אתם יכולים לשלוט בגישה לטבלאות חיצוניות של Iceberg באמצעות אבטחה ברמת העמודה, אבטחה ברמת השורה והסתרת נתונים.
אדמינים ב-BigQuery יכולים לאכוף בקרת גישה ברמת השורה וברמת העמודה, כולל הסתרת נתונים בטבלאות. כללי המדיניות של הגישה לטבלאות נאכפים גם כשמשתמשים ב-BigQuery Storage API כמקור נתונים לטבלה ב-Managed Service for Apache Spark וב-Serverless Spark.
שליחת שאילתות לטבלאות חיצוניות של Iceberg
מידע נוסף זמין במאמר שליחת שאילתות לנתוני Iceberg.
שליחת שאילתות לגבי נתונים היסטוריים
אתם יכולים לגשת לתמונות מצב של טבלאות חיצוניות של Iceberg שנשמרות במטא-נתונים של Iceberg באמצעות המשפט FOR SYSTEM_TIME AS OF.
אין תמיכה בחלונות זמן של שמירת נתונים מסוג Time travel ו-Fail-safe בטבלאות חיצוניות.
מיפוי נתונים
BigQuery ממיר את סוגי הנתונים של Iceberg לסוגי הנתונים של BigQuery, כמו שמוצג בטבלה הבאה:
| סוג הנתונים של Iceberg | סוג הנתונים ב-BigQuery |
|---|---|
boolean |
BOOL |
int |
INT64 |
long |
INT64 |
float |
FLOAT64 |
double |
FLOAT64 |
Decimal(P/S) |
NUMERIC or BIG_NUMERIC depending on precision |
date |
DATE |
time |
TIME |
timestamp |
DATETIME |
timestamptz |
TIMESTAMP |
string |
STRING |
uuid |
BYTES |
fixed(L) |
BYTES |
binary |
BYTES |
list<Type> |
ARRAY<Type> |
struct |
STRUCT |
map<KeyType, ValueType> |
ARRAY<Struct<key KeyType, value ValueType>> |
מגבלות
בנוסף למגבלות של טבלאות חיצוניות, לטבלאות חיצוניות של Iceberg יש את המגבלות הבאות:
אין תמיכה בשאילתות שמשתמשות ב-VPC Service Controls, והן גורמות לשגיאה כמו
NO_MATCHING_ACCESS_LEVEL.לטבלאות שמשתמשות במיזוג בזמן קריאה יש את המגבלות הבאות:
- שאילתה יכולה לעבד עד 100,000 רשומות של וקטורי מחיקה בטבלה. בטבלאות בגרסה 3 של Iceberg שמשתמשות בווקטורים בינאריים של מחיקה, כל קובץ נתונים שמשויך לווקטור מחיקה נספר כרשומת מחיקה אחת במגבלה הזו.
- אפשר לשייך כל קובץ נתונים לעד 10,000 קובצי מחיקה.
- אפשר להחיל עד 100,000 מחיקות שוות על קובץ נתונים.
- כדי לעקוף את המגבלות האלה, אתם יכולים לדחוס קובצי מחיקה ווקטורי מחיקה לעיתים קרובות, ליצור תצוגה מעל טבלת Iceberg שמונעת שינויים תכופים במחיצות, או לסנן שאילתות בעמודות מחולקות למחיצות כדי לצמצם את מספר קובצי הנתונים ווקטורי המחיקה שנסרקים.
ב-BigQuery אפשר לבצע חיתוך מניפסט באמצעות כל פונקציות הטרנספורמציה של מחיצות Iceberg. למידע נוסף על חיתוך מחיצות, ראו שליחת שאילתות לטבלאות מחולקות למחיצות. שאילתות שמפנות לטבלאות חיצוניות של Iceberg חייבות להכיל ערכים מילוליים בפרדיקטים בהשוואה לעמודות שמחולקות למחיצות.
יש תמיכה רק בקובצי נתונים מסוג Apache Parquet.
-
- אם טבלה חיצונית של Iceberg מחולקת למחיצות לפי עמודה שמכילה תווים לא אלפאנומריים, יכול להיות ש-BigQuery לא יוכל לחלץ את המטא-נתונים של המחיצה מהמניפסט, מה שעלול לגרום לסריקה מלאה של הטבלה.
- אי אפשר לשלוח שאילתות ישירות מ-BigQuery לטבלאות Iceberg שמכילות תווים מבניים (כמו נקודות
., סימני דולר$, סוגריים מרובעים[], סוגריים עגולים()או לוכסנים/). אם תהליך העבודה שלכם מחייב רישום של טבלאות כאלה בקטלוג הייעודי לזמן ריצה או בשירותי הקטלוג של Lakehouse, לשימוש בלעדי במנועים חיצוניים (כמו Spark או Trino), פנו אל Cloud Customer Care כדי לבקש הפעלה ברמת הפרויקט.
התכונות הבאות של Iceberg גרסה 3 לא נתמכות:
- סוגי נתונים חדשים: חותמת זמן בננו-שניות(tz), לא ידוע, וריאנט, גיאומטריה, גיאוגרפיה
- ערכי ברירת המחדל הראשוניים
- מפתחות הצפנה של טבלאות
עלויות של מיזוג בקריאה (merge-on-read)
החיוב על פי דרישה למיזוג נתונים בזמן הקריאה הוא סכום הסריקות של הנתונים הבאים:
- כל הבייטים הלוגיים שנקראו בקובץ הנתונים (כולל שורות שמסומנות כמחוקות לפי מיקום ומחיקות שוויון).
- בייטים לוגיים שנקראו בזמן הטעינה של קובצי וקטור המחיקה, מחיקת המיקום ומחיקת השוויון כדי למצוא את השורות שנמחקו בקובץ נתונים.
דרישת מסנן מחיצה
כדי לדרוש שימוש במסנני פרדיקט, אתם יכולים להפעיל את האפשרות דרישת מסנן מחיצה בטבלת Iceberg.
אם תפעילו את האפשרות הזו, ניסיונות לשלוח שאילתות לטבלה בלי לציין משפט WHERE שתואם לכל קובץ מניפסט יגרמו לשגיאה הבאה:
Cannot query over table project_id.dataset.table without a filter that can be used for partition elimination.
כל קובץ מניפסט דורש לפחות פרדיקט אחד שמתאים לביטול מחיצות.
אפשר להפעיל את require_partition_filter בדרכים הבאות כשיוצרים טבלת Iceberg :
SQL
משתמשים בהצהרה CREATE EXTERNAL TABLE.בדוגמה הבאה נוצרת טבלה חיצונית של Iceberg בשם TABLE עם מסנן מחיצות נדרש:
CREATE EXTERNAL TABLE TABLE
WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
OPTIONS (
format = 'ICEBERG',
uris = [URI],
require_partition_filter = true
)
מחליפים את מה שכתוב בשדות הבאים:
-
TABLE: שם הטבלה שרוצים ליצור. -
PROJECT_ID: מזהה הפרויקט שמכיל את הטבלה שרוצים ליצור. -
REGION: המיקום שבו רוצים ליצור את טבלת Iceberg.
CONNECTION_ID: מזהה החיבור. לדוגמה,myconnection.
URI: ה-URI של Cloud Storage עם קובץ המטא-נתונים העדכני בפורמט JSON.לדוגמה,
gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json.ה-URI יכול להפנות גם למיקום חיצוני בענן, כמו Amazon S3 או Azure Blob Storage.
- דוגמה ל-AWS:
s3://mybucket/iceberg/metadata/1234.metadata.json. - דוגמה ל-Azure:
azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json.
- דוגמה ל-AWS:
BQ
משתמשים בפקודה bq mk --table עם המעצב @connection כדי לציין את החיבור שבו רוצים להשתמש בסוף הפרמטר --external_table_definition.
משתמשים ב---require_partition_filter כדי להפעיל את מסנן המחיצה הנדרש.
בדוגמה הבאה נוצרת טבלה חיצונית של Iceberg בשם TABLE, עם דרישת מסנן מחיצה:
bq mk \ --table \ --external_table_definition=ICEBERG=URI@projects/CONNECTION_PROJECT_ID/locations/CONNECTION_REGION/connections/CONNECTION_ID \ PROJECT_ID:DATASET.EXTERNAL_TABLE \ --require_partition_filter
מחליפים את מה שכתוב בשדות הבאים:
URI: קובץ המטא-נתונים העדכני בפורמט JSON של תמונת מצב ספציפית של טבלהלדוגמה,
gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json.ה-URI יכול להפנות גם למיקום חיצוני בענן, כמו Amazon S3 או Azure Blob Storage.
- דוגמה ל-AWS:
s3://mybucket/iceberg/metadata/1234.metadata.json. - דוגמה ל-Azure:
azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json.
- דוגמה ל-AWS:
CONNECTION_PROJECT_ID: הפרויקט שמכיל את החיבור ליצירת הטבלה החיצונית של Iceberg, לדוגמהmyproject
CONNECTION_REGION: האזור שבו נמצא החיבור ליצירת הטבלה החיצונית של Iceberg. לדוגמה,us.
CONNECTION_ID: מזהה החיבור. לדוגמה,myconnection.כשמציגים את פרטי החיבור במסוף Google Cloud , מזהה החיבור הוא הערך בקטע האחרון של מזהה החיבור המלא שמוצג ב-Connection ID, לדוגמה
projects/myproject/locations/connection_location/connections/myconnection.
DATASET: השם של מערך הנתונים ב-BigQueryקבוצת נתונים שמכילה את הטבלה שרוצים לעדכן. לדוגמה,
mydataset.
EXTERNAL_TABLE: שם הטבלה שרוצים ליצורלדוגמה,
mytable.
אתם יכולים גם לעדכן את טבלת Iceberg כדי להפעיל את מסנן המחיצה הנדרש.
אם לא הפעלתם את האפשרות דרישת מסנן מחיצה כשאתם יוצרים את הטבלה המחולקת למחיצות, אתם יכולים לעדכן את הטבלה כדי להוסיף את האפשרות.
BQ
משתמשים בפקודה bq update ומציינים את הדגל --require_partition_filter.
לדוגמה:
כדי לעדכן את mypartitionedtable ב-mydataset בפרויקט ברירת המחדל, מזינים:
bq update --require_partition_filter PROJECT_ID:DATASET.TABLE
המאמרים הבאים
- מידע על פרוצדורות מאוחסנות ב-Spark
- מידע על כללי מדיניות של בקרת גישה
- מידע על הרצת שאילתות ב-BigQuery
- מידע ולמידה על הצהרות וניבי SQL נתמכים ב-BigQuery