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

הסכימה הגמישה של Bigtable מאפשרת לאחסן נתונים מכל סוג בטבלה של Bigtable – מחרוזות, תאריכים, מספרים, מסמכי JSON, ואפילו תמונות או קובצי PDF.

במסמך הזה מוסבר מתי Bigtable אוכף את הסוג, ודורש מכם לקודד או לפענח אותו בקוד האפליקציה. רשימה של סוגי הנתונים של Bigtable מופיעה בקטע Type במאמרי העזרה של Data API.

סוגים שנאכפים

סוג הנתונים נאכף על הנתונים הבאים:

  • קבוצות עמודות נצברות (מונים)
  • חותמות זמן
  • תצוגות מהותיות רציפות
  • מפתחות שורה מובנים

צבירת נתונים

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

בטבלה הזו מוצגים סוג הקלט והקידוד של כל סוג צבירה.

סוג צבירה סוג הקלט קידוד
סכום Int64 BigEndianBytes
מינימום Int64 BigEndianBytes
מקסימום Int64 BigEndianBytes
HLL בייטים Zetasketch HLL++‎

כששולחים שאילתה על הנתונים בתאים המצטברים באמצעות SQL, ‏ SQL משלב באופן אוטומטי את פרטי הסוג.

כשקוראים את הנתונים בתאי צבירה באמצעות השיטה ReadRows של Data API, ‏Bigtable מחזיר בייטים, ולכן האפליקציה צריכה לפענח את הערכים באמצעות הקידוד שבו Bigtable השתמש כדי למפות את הנתונים המוקלדים לבייטים.

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

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

חותמות זמן

לכל תא ב-Bigtable יש חותמת זמן של Int64 שמייצגת את מספר המיקרו-שניות מאז ראשית זמן יוניקס (Unix epoch), 1970-01-01 00:00:00 UTC.

מקור חותמת הזמן

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

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

רמת הפירוט והדיוק של חותמת הזמן

‫Bigtable תומך ברמות הפירוט הבאות של חותמות זמן:

  • רמת פירוט של אלפיות השנייה (ברירת מחדל): חותמת הזמן חייבת להיות ערך של מיליוניות השנייה עם דיוק של אלפיות השנייה לכל היותר, למשל 3023483279876000. ‫Bigtable דוחה חותמות זמן שצוינו על ידי המשתמשים עם דיוק של מיקרו-שניות, ומקצרת חותמות זמן שנוצרו על ידי Bigtable עם דיוק של מיקרו-שניות לדיוק של אלפיות השנייה.
  • רמת פירוט של מיקרו-שנייה: חותמת הזמן יכולה להיות ברמת דיוק מלאה של מיקרו-שנייה, כמו 3023483279876543. ב-Bigtable אפשר להשתמש בחותמות זמן שנוצרו על ידי המשתמש או על ידי Bigtable, ברמת דיוק של מיקרו-שנייה.

את רמת הפירוט של חותמת הזמן מגדירים כשיוצרים טבלה.

מגבלות על חותמות זמן

המגבלות הבאות חלות על טבלאות עם חותמות זמן ברמת פירוט של מיקרו-שניות:

  • רק ספריית הלקוח של Bigtable ל-Java בגרסה 2.82.0 ואילך תומכת ברמת פירוט של מיקרו-שניות בחותמות זמן. בקשות קריאה או כתיבה שמשתמשות בלקוח אחר נכשלות.
  • רמת הפירוט של חותמת הזמן במיקרו-שניות זמינה רק למכונות במהדורת Enterprise Plus.
  • אי אפשר לשנות את רמת הפירוט של חותמת הזמן של טבלה אחרי שהיא נוצרה.
  • אי אפשר ליצור תצוגות מהותיות רציפות בטבלאות עם רמת פירוט של מיקרו-שניות.
  • אי אפשר ליצור תצוגות לוגיות בטבלאות עם רמת פירוט של מיקרו-שניות.
  • אי אפשר לשדרג לאחור מכונה מ-Enterprise Plus ל-Enterprise אם היא מכילה טבלאות עם רמת פירוט של מיקרו-שניות. צריך למחוק את הטבלאות האלה לפני שמתחילים את השדרוג לאחור.
  • אפשר לשחזר גיבויים של טבלאות עם רמת פירוט של מיקרו-שניות רק למכונות Enterprise Plus.

תצוגות מהותיות רציפות

תצוגות מהותיות רציפות הן משאבים לקריאה בלבד שאפשר לקרוא באמצעות SQL או באמצעות קריאה ל-ReadRows Data API. הנתונים בתצוגה מהותית מוקלדים על סמך השאילתה שמגדירה אותה. לסקירה כללית, ראו תצוגות מהותיות רציפות.

כשמשתמשים ב-SQL כדי לשלוח שאילתה לתצוגה מהותית רציפה, SQL משלב באופן אוטומטי את פרטי הסוג.

כשקוראים מתצוגת חומרים רציפה באמצעות בקשת ReadRows של Data API, צריך לדעת את הסוג של כל עמודה ולפענח אותו בקוד האפליקציה.

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

סוג קידוד
BOOL ערך של בייט אחד, 1 = true, ‏ 0 = false
BYTES ללא קידוד
‫INT64 (או INT, ‏ SMALLINT, ‏ INTEGER, ‏ BIGINT, ‏ TINYINT, ‏ BYTEINT) ‫64 ביט big-endian
FLOAT64 ‫IEEE 754 ב-64 ביט, לא כולל NaN ו-‎+/-inf
מחרוזת UTF-8
TIME/TIMESTAMP מספר שלם של 64 ביט שמייצג את מספר המיקרו-שניות מאז ראשית זמן יוניקס (Unix epoch) (תואם ל-GoogleSQL)
מידע נוסף זמין במאמר קידוד במאמרי העזרה של Data API.

מפתחות שורה מובנים

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

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

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

סוגים שלא נאכפים

אם לא מספקים מידע על הסוג, Bigtable מתייחס לכל תא כבייטים עם קידוד לא ידוע.

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

למרות ש-Bigtable לא אוכף סוגים, פעולות מסוימות מניחות סוג נתונים. כך תוכלו לוודא שהנתונים שלכם נכתבים באופן שמאפשר לעבד אותם במסד הנתונים. הנה כמה דוגמאות:

  • הגדלות באמצעות ReadModifyWriteRow מניחות שהתא מכיל מספר שלם חתום של 64 ביט big-endian.
  • הפונקציה TO_VECTOR64 ב-SQL מצפה שהתא יכיל מערך בייטים שהוא שרשור של בייטים מסוג big-endian של מספרים עם נקודה צפה (floating point) של 64 ביט.
  • הפונקציה TO_VECTOR32 ב-SQL מצפה שהתא יכיל מערך בייטים שהוא שרשור של בייטים מסוג big-endian של מספרים עם נקודה צפה (floating point) של 32 ביט.

המאמרים הבאים