יצירת תצוגות לוגיות

במאמר הזה נסביר איך ליצור תצוגות לוגיות ב-BigQuery.

אפשר ליצור תצוגה לוגית בדרכים הבאות:

  • באמצעות מסוף Cloud de Confiance .
  • שימוש בפקודה bq mk של כלי שורת הפקודה של bq.
  • קריאה ל-API method ‏tables.insert.
  • שימוש בספריות לקוח.
  • שליחת הצהרה של שפת הגדרת נתונים (DDL) CREATE VIEW.

הצגת ההגבלות

תצוגות מפורטות של BigQuery כפופות למגבלות הבאות:

  • התצוגות הן לקריאה בלבד. לדוגמה, אי אפשר להריץ שאילתות שמוסיפות, מעדכנות או מוחקות נתונים.
  • מערך הנתונים שמכיל את התצוגה ומערך הנתונים שמכיל את הטבלאות שהתצוגה מפנה אליהן צריכים להיות באותו מיקום.
  • הפניה בתוך תצוגה חייבת להיות מוגדרת באמצעות מערך נתונים. קבוצת הנתונים שמוגדרת כברירת מחדל לא משפיעה על גוף התצוגה.
  • אי אפשר להשתמש ב-method TableDataList API בפורמט JSON כדי לאחזר נתונים מתצוגה מפורטת. מידע נוסף זמין במאמר בנושא Tabledata: list.
  • כשמשתמשים בתצוגות מפורטות, אי אפשר לשלב בין שאילתות GoogleSQL לבין שאילתות SQL מדור קודם. שאילתת GoogleSQL לא יכולה להפנות לתצוגה שהוגדרה באמצעות תחביר SQL מדור קודם.
  • אי אפשר להפנות אל פרמטרים של שאילתות בתצוגות מפורטות.
  • הסכימות של הטבלאות הבסיסיות מאוחסנות עם התצוגה כשהתצוגה נוצרת. אם מוסיפים, מוחקים או משנים עמודות אחרי יצירת התצוגה, התצוגה לא מתעדכנת באופן אוטומטי והסכימה המדווחת תישאר לא מדויקת עד שישנו את הגדרת ה-SQL של התצוגה או עד שיצרו מחדש את התצוגה. גם אם הסכימה שדווחה לא מדויקת, כל השאילתות שנשלחו מניבות תוצאות מדויקות.
  • אי אפשר לעדכן אוטומטית תצוגת SQL מדור קודם לתחביר של GoogleSQL. כדי לשנות את השאילתה שמשמשת להגדרת תצוגה, אפשר להשתמש באפשרויות הבאות:
  • אי אפשר לכלול פונקציה זמנית בהגדרת המשתמש או טבלה זמנית בשאילתת ה-SQL שמגדירה תצוגה.
  • אי אפשר להפנות לתצוגה בשאילתה של טבלת תו כללי לחיפוש.

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

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

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

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

תצוגות מפורטות נחשבות למשאבי טבלה ב-BigQuery, ולכן כדי ליצור תצוגה מפורטת צריך את אותן הרשאות שנדרשות ליצירת טבלה. צריכות להיות לכם גם הרשאות להריץ שאילתות על כל הטבלאות שהשאילתת SQL של התצוגה מפנה אליהן.

כדי ליצור תצוגה מפורטת, צריך bigquery.tables.createהרשאת IAM. תפקיד ה-IAM המוגדר מראש roles/bigquery.dataEditor כולל את ההרשאות שנדרשות ליצירת תצוגה.

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

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

הצגת השם

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

  • להכיל תווים עם סך של עד 1,024 בייטים בקידוד UTF-8.
  • להכיל תווים ב-Unicode בקטגוריות L (אות), M (סימן), N (מספר), Pc (מחבר, כולל קו תחתון), Pd (מקף), Zs (רווח). מידע נוסף זמין במאמר בנושא קטגוריה כללית.

השמות הבאים הם דוגמאות לשמות תקינים של תצוגות מפורטות: view 01, ग्राहक, 00_お客様, étudiant-01.

הערות:

  • כברירת מחדל, שמות של טבלאות הם תלויי אותיות רישיות. ‫mytable ו-MyTable יכולים להתקיים יחד באותו מערך נתונים, אלא אם הם חלק ממערך נתונים שבו ההבחנה בין אותיות רישיות לאותיות קטנות מושבתת.
  • חלק משמות התצוגות ומקידומות השמות שמורים. אם מוצגת לכם הודעת שגיאה שאומרת ששם התצוגה המפורטת או התחילית שמורים, צריך לבחור שם אחר ולנסות שוב.
  • אם כוללים כמה אופרטורים של נקודה (.) ברצף, המערכת מסירה באופן משתמע את האופרטורים הכפולים.

    לדוגמה, כך: project_name....dataset_name..table_name

    הופך ל: project_name.dataset_name.table_name

יצירת תצוגה

אפשר ליצור תצוגה על ידי כתיבת שאילתת SQL המשמשת להגדרת הנתונים הנגישים לתצוגה. שאילתת ה-SQL צריכה לכלול הצהרת SELECT. אסור להשתמש בסוגים אחרים של הצהרות (כמו הצהרות DML) ובשאילתות עם כמה הצהרות בשאילתות של תצוגות.

כדי ליצור תצוגה מפורטת:

המסוף

  1. במסוף Cloud de Confiance , עוברים לדף BigQuery.

    כניסה ל-BigQuery

  2. לוחצים על שאילתת SQL.

  3. מזינים שאילתת SQL תקינה בעורך השאילתות.

    אפשר גם לפתוח שאילתה שנשמרה.

  4. לוחצים על Save > Save view.

    שמירת התצוגה.

  5. בתיבת הדו-שיח שמירת התצוגה:

    • בתפריט Project, בוחרים פרויקט לאחסון התצוגה.
    • בתפריט Dataset (מערך נתונים), בוחרים מערך נתונים או יוצרים מערך נתונים חדש כדי לאחסן את התצוגה. מערך נתוני היעד של תצוגה שמורה חייב להיות באותו אזור כמו המקור.
    • בשדה Table, מזינים את שם התצוגה.
    • לוחצים על Save.

SQL

משתמשים בהצהרה CREATE VIEW. בדוגמה הבאה נוצרת תצוגה בשם usa_male_names ממערך הנתונים הציבורי USA names:

  1. במסוף Cloud de Confiance , עוברים לדף BigQuery.

    כניסה ל-BigQuery

  2. מזינים את ההצהרה הבאה בעורך השאילתות:

    CREATE VIEW mydataset.usa_male_names(name, number) AS (
      SELECT
        name,
        number
      FROM
        `bigquery-public-data.usa_names.usa_1910_current`
      WHERE
        gender = 'M'
      ORDER BY
        number DESC
    );

  3. לוחצים על הפעלה.

מידע נוסף על הרצת שאילתות זמין במאמר הרצת שאילתה אינטראקטיבית.

BQ

משתמשים בפקודה bq mk עם הדגל --view. בשביל שאילתות GoogleSQL, מוסיפים את הדגל --use_legacy_sql ומגדירים אותו לערך false. בין הפרמטרים האופציונליים אפשר למצוא את --add_tags,‏ --expiration,‏ --description ו---label. רשימה מלאה של הפרמטרים זמינה במאמר העזרה בנושא הפקודה bq mk.

אם השאילתה שלכם מפנה למשאבי פונקציות חיצוניות שהוגדרו על ידי המשתמש (UDF) ונשמרו ב-Cloud Storage או בקבצים מקומיים, צריך להשתמש בדגל --view_udf_resource כדי לציין את המשאבים האלה. הדגל --view_udf_resource לא מוסבר כאן. מידע נוסף על שימוש בפונקציות UDF זמין במאמר בנושא פונקציות UDF.

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

bq mk \
--use_legacy_sql=false \
--view_udf_resource=PATH_TO_FILE \
--expiration=INTEGER \
--description="DESCRIPTION" \
--label=KEY_1:VALUE_1 \
--add_tags=KEY_2:VALUE_2[,...] \
--view='QUERY' \
--project_id=PROJECT_ID \
DATASET.VIEW

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

  • PATH_TO_FILE הוא ה-URI או הנתיב במערכת הקבצים המקומית לקובץ קוד שייטען ויוערך באופן מיידי כמשאב UDF שמשמש את התצוגה. כדי לציין כמה קבצים, חוזרים על הפעולה של הוספת הדגל.
  • INTEGER מגדיר את משך החיים (בשניות) של התצוגה. אם הערך של INTEGER הוא 0, התצוגה לא תפוג. אם לא כוללים את הדגל --expiration, BigQuery יוצר את התצוגה עם משך החיים של הטבלה שמוגדר כברירת מחדל במערך הנתונים.
  • DESCRIPTION הוא תיאור של התצוגה המפורטת במירכאות.
  • KEY_1:VALUE_1 הוא צמד מפתח/ערך שמייצג תווית. כדי לציין כמה תוויות, חוזרים על האפשרות --label.
  • KEY_2:VALUE_2 הוא צמד מפתח/ערך שמייצג תג. כדי להוסיף כמה תגים לאותו דגל, מפרידים בין צמדי המפתח:ערך באמצעות פסיקים.
  • QUERY היא שאילתה תקינה.
  • PROJECT_ID הוא מזהה הפרויקט (אם לא הגדרתם פרויקט ברירת מחדל).
  • DATASET הוא מערך נתונים בפרויקט.
  • VIEW הוא השם של התצוגה שרוצים ליצור.

דוגמאות:

מזינים את הפקודה הבאה כדי ליצור תצוגה בשם myview ב-mydataset בפרויקט ברירת המחדל. זמן התפוגה מוגדר ל-3,600 שניות (שעה אחת), התיאור מוגדר ל-This is my view והתווית מוגדרת ל-organization:development. השאילתה שמשמשת ליצירת התצוגה שולפת נתונים ממערך הנתונים הציבורי USA Name Data.

bq mk \
--use_legacy_sql=false \
--expiration 3600 \
--description "This is my view" \
--label organization:development \
--view \
'SELECT
  name,
  number
FROM
  `bigquery-public-data.usa_names.usa_1910_current`
WHERE
  gender = "M"
ORDER BY
  number DESC' \
mydataset.myview

מזינים את הפקודה הבאה כדי ליצור תצוגה בשם myview ב-mydataset ב-myotherproject. התיאור מוגדר כ-This is my view, התווית מוגדרת כ-organization:development, ותאריך התפוגה של התצוגה מוגדר כברירת המחדל של תאריך התפוגה של הטבלה במערך הנתונים. השאילתה שמשמשת ליצירת התצוגה שולפת נתונים ממערך הנתונים הציבורי USA Name Data.

bq mk \
--use_legacy_sql=false \
--description "This is my view" \
--label organization:development \
--project_id myotherproject \
--view \
'SELECT
  name,
  number
FROM
  `bigquery-public-data.usa_names.usa_1910_current`
WHERE
  gender = "M"
ORDER BY
  number DESC' \
mydataset.myview

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

Terraform

משתמשים במשאב google_bigquery_table.

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

בדוגמה הבאה נוצרת תצוגה מפורטת בשם myview:

resource "google_bigquery_dataset" "default" {
  dataset_id                      = "mydataset"
  default_partition_expiration_ms = 2592000000  # 30 days
  default_table_expiration_ms     = 31536000000 # 365 days
  description                     = "dataset description"
  location                        = "US"
  max_time_travel_hours           = 96 # 4 days

  labels = {
    billing_group = "accounting",
    pii           = "sensitive"
  }
}

resource "google_bigquery_table" "default" {
  dataset_id = google_bigquery_dataset.default.dataset_id
  table_id   = "myview"

  view {
    query          = "SELECT global_id, faa_identifier, name, latitude, longitude FROM `bigquery-public-data.faa.us_airports`"
    use_legacy_sql = false
  }

}

כדי להחיל את ההגדרות של Terraform בפרויקט ב- Cloud de Confiance , מבצעים את השלבים בקטעים הבאים.

הכנת Cloud Shell

  1. מפעילים את Cloud Shell.
  2. מגדירים את פרויקט ברירת המחדל שבו רוצים להחיל את ההגדרות של Terraform. Cloud de Confiance

    תצטרכו להריץ את הפקודה הזו רק פעם אחת לכל פרויקט, ותוכלו לעשות זאת בכל ספרייה.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

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

הכנת הספרייה

לכל קובץ תצורה של Terraform צריכה להיות ספרייה משלו (שנקראת גם מודול ברמה הבסיסית).

  1. יוצרים ספרייה חדשה ב-Cloud Shell ובה יוצרים קובץ חדש. שם הקובץ חייב לכלול את הסיומת .tf, למשל main.tf. במדריך הזה, הקובץ נקרא main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. אם אתם עוקבים אחרי המדריך, תוכלו להעתיק את הקוד לדוגמה בכל קטע או שלב.

    מעתיקים את הקוד לדוגמה בקובץ main.tf החדש שיצרתם.

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

  3. בודקים את הפרמטרים לדוגמה ומשנים אותם בהתאם לסביבה שלכם.
  4. שומרים את השינויים.
  5. מפעילים את Terraform. צריך לעשות זאת רק פעם אחת לכל ספרייה.
    terraform init

    אופציונלי: תוכלו לכלול את האפשרות -upgrade, כדי להשתמש בגרסה העדכנית ביותר של הספק של Google:

    terraform init -upgrade

החלה של השינויים

  1. בודקים את ההגדרות ומוודאים שהמשאבים שמערכת Terraform תיצור או תעדכן תואמים לציפיות שלכם:
    terraform plan

    מתקנים את ההגדרות לפי הצורך.

  2. מריצים את הפקודה הבאה ומזינים yes בהודעה שמופיעה, כדי להחיל את הגדרות Terraform:
    terraform apply

    ממתינים עד שב-Terraform תוצג ההודעה "Apply complete!‎".

  3. פותחים את Cloud de Confiance הפרויקט כדי לראות את התוצאות. במסוף Cloud de Confiance , נכנסים למשאבים בממשק המשתמש כדי לוודא שהם נוצרו או עודכנו ב-Terraform.

API

מבצעים קריאה לשיטה tables.insert עם משאב טבלה שמכיל מאפיין view.

Go

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

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

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// createView demonstrates creation of a BigQuery logical view.
func createView(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydatasetid"
	// tableID := "mytableid"
	ctx := context.Background()

	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	meta := &bigquery.TableMetadata{
		// This example shows how to create a view of the shakespeare sample dataset, which
		// provides word frequency information.  This view restricts the results to only contain
		// results for works that contain the "king" in the title, e.g. King Lear, King Henry V, etc.
		ViewQuery: "SELECT word, word_count, corpus, corpus_date FROM `bigquery-public-data.samples.shakespeare` WHERE corpus LIKE '%king%'",
	}
	if err := client.Dataset(datasetID).Table(tableID).Create(ctx, meta); err != nil {
		return err
	}
	return nil
}

Java

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

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

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;
import com.google.cloud.bigquery.TableInfo;
import com.google.cloud.bigquery.ViewDefinition;

// Sample to create a view
public class CreateView {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    String viewName = "MY_VIEW_NAME";
    String query =
        String.format(
            "SELECT TimestampField, StringField, BooleanField FROM %s.%s", datasetName, tableName);
    createView(datasetName, viewName, query);
  }

  public static void createView(String datasetName, String viewName, String query) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId tableId = TableId.of(datasetName, viewName);

      ViewDefinition viewDefinition =
          ViewDefinition.newBuilder(query).setUseLegacySql(false).build();

      bigquery.create(TableInfo.of(tableId, viewDefinition));
      System.out.println("View created successfully");
    } catch (BigQueryException e) {
      System.out.println("View was not created. \n" + e.toString());
    }
  }
}

Node.js

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

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

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

// Import the Google Cloud client library and create a client
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function createView() {
  // Creates a new view named "my_shared_view" in "my_dataset".

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const myDatasetId = "my_table"
  // const myTableId = "my_table"
  // const projectId = "bigquery-public-data";
  // const sourceDatasetId = "usa_names"
  // const sourceTableId = "usa_1910_current";
  const myDataset = await bigquery.dataset(myDatasetId);

  // For all options, see https://cloud.google.com/bigquery/docs/reference/v2/tables#resource
  const options = {
    view: `SELECT name 
    FROM \`${projectId}.${sourceDatasetId}.${sourceTableId}\`
    LIMIT 10`,
  };

  // Create a new view in the dataset
  const [view] = await myDataset.createTable(myTableId, options);

  console.log(`View ${view.id} created.`);
}

Python

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

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

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

from google.cloud import bigquery

client = bigquery.Client()

view_id = "my-project.my_dataset.my_view"
source_id = "my-project.my_dataset.my_table"
view = bigquery.Table(view_id)

# The source table in this example is created from a CSV file in Google
# Cloud Storage located at
# `gs://cloud-samples-data/bigquery/us-states/us-states.csv`. It contains
# 50 US states, while the view returns only those states with names
# starting with the letter 'W'.
view.view_query = f"SELECT name, post_abbr FROM `{source_id}` WHERE name LIKE 'W%'"

# Make an API request to create the view.
view = client.create_table(view)
print(f"Created {view.table_type}: {str(view.reference)}")

אחרי שיוצרים את התצוגה, מריצים עליה שאילתה כמו שמריצים שאילתה על טבלה.

צפייה באבטחה

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

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