כתיבת תוצאות של שאילתות

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

טבלאות זמניות וקבועות

המערכת של BigQuery שומרת את כל התוצאות של השאילתה בטבלה שיכולה להיות קבועה או זמנית.

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

  • אחרי שהשאילתה מסתיימת, הטבלה הזמנית קיימת למשך עד 24 שעות. כדי לראות את המבנה והנתונים של הטבלה:

    1. נכנסים לדף BigQuery.

      כניסה ל-BigQuery

    2. בחלונית השמאלית, לוחצים על Explorer:

      כפתור מודגש לחלונית Explorer.

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

    3. בחלונית Explorer, לוחצים על Job history.

    4. לוחצים על היסטוריה אישית.

    5. בוחרים את השאילתה שיצרה את הטבלה הזמנית. אחר כך, בשורה טבלת יעדים, לוחצים על Temporary table.

  • הגישה לנתונים בטבלה הזמנית מוגבלת למשתמש או לחשבון השירות שיצרו את משימת השאילתה.

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

  • טבלאות זמניות נוצרות באותו אזור שבו נמצאות הטבלאות ששולחים אליהן שאילתות.

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

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

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

כדי לכתוב תוצאות של שאילתה בטבלה, אתם צריכים לקבל לפחות את ההרשאות הבאות:

  • הרשאות bigquery.tables.create ליצירת טבלה חדשה
  • ‫bigquery.tables.updateData כדי לכתוב נתונים בטבלה חדשה, להחליף טבלה או להוסיף נתונים לטבלה.
  • ‫bigquery.jobs.create כדי להריץ משימת שאילתה

יכול להיות שצריך הרשאות נוספות כמו bigquery.tables.getData כדי לגשת לנתונים שאתם שולחים לגביהם שאילתות.

התפקידים המוגדרים מראש הבאים ב-IAM כוללים את ההרשאות bigquery.tables.create ו-bigquery.tables.updateData:

  • bigquery.dataEditor
  • bigquery.dataOwner
  • bigquery.admin

התפקידים הבאים שמוגדרים מראש ב-IAM כוללים את ההרשאות של bigquery.jobs.create:

  • bigquery.user
  • bigquery.jobUser
  • bigquery.admin

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

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

כתיבת תוצאות של שאילתה בטבלה קבועה

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

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

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

המסוף

  1. פותחים את הדף BigQuery במסוף Google Cloud .

    כניסה לדף BigQuery

  2. בחלונית השמאלית, לוחצים על Explorer:

    כפתור מודגש לחלונית Explorer.

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

  3. בחלונית Explorer, מרחיבים את הפרויקט, לוחצים על Datasets ובוחרים קבוצת נתונים.

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

  5. לוחצים על עריכה > הגדרות השאילתה.

    הגדרות השאילתה

  6. בוחרים באפשרות Set a destination table for query results.

    הגדרת היעד

  7. בקטע Destination, בוחרים את מערך הנתונים שבו רוצים ליצור את הטבלה, ואז בוחרים מזהה טבלה.

  8. בקטע Destination table write preference, בוחרים אחת מהאפשרויות הבאות:

    • Write if empty – כתיבת תוצאות השאילתה בטבלה רק אם הטבלה ריקה.
    • ‫Append to table – הוספת תוצאות השאילתה לטבלה קיימת.
    • ‫Overwrite table – החלפת טבלה קיימת עם אותו שם בתוצאות השאילתה.
  9. אופציונלי: בשדה Data location, בוחרים את המיקום.

  10. כדי לעדכן את הגדרות השאילתה, לוחצים על שמירה.

  11. לוחצים על Run. כך נוצרת משימת שאילתה שכותבת את תוצאות השאילתה בטבלה שציינתם.

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

SQL

בדוגמה הבאה משתמשים בהצהרת CREATE TABLE כדי ליצור את הטבלה trips מהנתונים בטבלה הציבורית bikeshare_trips:

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

    כניסה ל-BigQuery

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

    CREATE TABLE mydataset.trips AS (
      SELECT
        bike_id,
        start_time,
        duration_minutes
      FROM
        bigquery-public-data.austin_bikeshare.bikeshare_trips
    );

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

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

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

BQ

  1. מפעילים את Cloud Shell במסוף Google Cloud .

    הפעלת Cloud Shell

    בחלק התחתון של מסוף Google Cloud יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.

  2. מזינים את הפקודה bq query ומציינים את הדגל --destination_table כדי ליצור טבלה קבועה על סמך תוצאות השאילתה. מציינים את הדגל use_legacy_sql=false כדי להשתמש בתחביר GoogleSQL. כדי לכתוב את תוצאות השאילתה בטבלה שלא נמצאת בפרויקט ברירת המחדל, צריך להוסיף את מזהה הפרויקט לשם של קבוצת הנתונים בפורמט הבא: project_id:dataset.

    אופציונלי: מוסיפים את הדגל --location ומגדירים את הערך למיקום שלכם.

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

    • ‫--append_table: אם טבלת היעד קיימת, תוצאות השאילתה מצורפות אליה.
    • --replace: אם טבלת היעד קיימת, היא מוחלפת בתוצאות השאילתה.

      bq --location=location query \
      --destination_table project_id:dataset.table \
      --use_legacy_sql=false 'query'

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

    • ‫location הוא שם המיקום שבו מעובדת השאילתה. הדגל --location הוא אופציונלי. לדוגמה, אם אתם משתמשים ב-BigQuery באזור טוקיו, אתם יכולים להגדיר את הערך של הדגל ל-asia-northeast1. אפשר להגדיר ערך ברירת מחדל למיקום באמצעות הקובץ .bigqueryrc.

    • ‫project_id הוא מזהה הפרויקט.

    • ‫dataset הוא השם של קבוצת הנתונים שמכילה את הטבלה שאליה כותבים את תוצאות השאילתה.

    • ‫table הוא שם הטבלה שאליה כותבים את תוצאות השאילתה.

    • ‫query היא שאילתה בתחביר של GoogleSQL.

      אם לא צוין דגל של write disposition, פעולת ברירת המחדל היא לכתוב את התוצאות בטבלה רק אם היא ריקה. אם הטבלה קיימת והיא לא ריקה, תוחזר השגיאה הבאה: BigQuery error in query operation: Error processing job project_id:bqjob_123abc456789_00000e1234f_1: Already Exists: Table project_id:dataset.table.

      דוגמאות:

      מזינים את הפקודה הבאה כדי לכתוב את תוצאות השאילתה בטבלת יעד בשם mytable ב-mydataset. מערך הנתונים נמצא בפרויקט שמוגדר כברירת מחדל. מכיוון שלא צוין בפקודה דגל של write disposition, הטבלה צריכה להיות חדשה או ריקה. אחרת, תוחזר השגיאה Already exists. השאילתה מאחזרת נתונים ממערך הנתונים הציבורי USA Name Data.

      bq query \
      --destination_table mydataset.mytable \
      --use_legacy_sql=false \
      'SELECT
      name,
      number
      FROM
      `bigquery-public-data`.usa_names.usa_1910_current
      WHERE
      gender = "M"
      ORDER BY
      number DESC'

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

      bq query \
      --destination_table mydataset.mytable \
      --replace \
      --use_legacy_sql=false \
      'SELECT
      name,
      number
      FROM
      `bigquery-public-data`.usa_names.usa_1910_current
      WHERE
      gender = "M"
      ORDER BY
      number DESC'

      מזינים את הפקודה הבאה כדי להוסיף את תוצאות השאילתה לטבלת יעד בשם mytable ב-mydataset. מערך הנתונים נמצא ב-my-other-project, ולא בפרויקט שמוגדר כברירת מחדל. הפקודה משתמשת בדגל --append_table כדי להוסיף את תוצאות השאילתה לטבלת היעד.

      bq query \
      --append_table \
      --use_legacy_sql=false \
      --destination_table my-other-project:mydataset.mytable \
      'SELECT
      name,
      number
      FROM
      `bigquery-public-data`.usa_names.usa_1910_current
      WHERE
      gender = "M"
      ORDER BY
      number DESC'

      הפלט של כל אחת מהדוגמאות האלה נראה כך: כדי שהפלט יהיה קריא, חלק ממנו נחתך.

      Waiting on bqjob_r123abc456_000001234567_1 ... (2s) Current status: DONE
      +---------+--------+
      |  name   | number |
      +---------+--------+
      | Robert  |  10021 |
      | John    |   9636 |
      | Robert  |   9297 |
      | ...              |
      +---------+--------+
      

API

כדי לשמור את תוצאות השאילתה בטבלה קבועה, מפעילים את ה-method‏ jobs.insert, מגדירים משימת query וכוללים ערך למאפיין destinationTable. כדי לשלוט בנטיית הכתיבה של טבלת יעד קיימת, מגדירים את המאפיין writeDisposition.

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

המשך

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

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

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/bigquery"
	"google.golang.org/api/iterator"
)

// queryWithDestination demonstrates saving the results of a query to a specific table by setting the destination
// via the API properties.
func queryWithDestination(w io.Writer, projectID, destDatasetID, destTableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	q := client.Query("SELECT 17 as my_col")
	q.Location = "US" // Location must match the dataset(s) referenced in query.
	q.QueryConfig.Dst = client.Dataset(destDatasetID).Table(destTableID)
	// Run the query and print results when the query job is completed.
	job, err := q.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}
	if err := status.Err(); err != nil {
		return err
	}
	it, err := job.Read(ctx)
	for {
		var row []bigquery.Value
		err := it.Next(&row)
		if err == iterator.Done {
			break
		}
		if err != nil {
			return err
		}
		fmt.Fprintln(w, row)
	}
	return nil
}

Java

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

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

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

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.TableId;

public class SaveQueryToTable {

  public static void runSaveQueryToTable() {
    // TODO(developer): Replace these variables before running the sample.
    String query = "SELECT corpus FROM `bigquery-public-data.samples.shakespeare` GROUP BY corpus;";
    String destinationTable = "MY_TABLE";
    String destinationDataset = "MY_DATASET";

    saveQueryToTable(destinationDataset, destinationTable, query);
  }

  public static void saveQueryToTable(
      String destinationDataset, String destinationTableId, 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();

      // Identify the destination table
      TableId destinationTable = TableId.of(destinationDataset, destinationTableId);

      // Build the query job
      QueryJobConfiguration queryConfig =
          QueryJobConfiguration.newBuilder(query).setDestinationTable(destinationTable).build();

      // Execute the query.
      bigquery.query(queryConfig);

      // The results are now saved in the destination table.

      System.out.println("Saved query ran successfully");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Saved query did not run \n" + e.toString());
    }
  }
}

Node.js

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

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

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

async function queryDestinationTable() {
  // Queries the U.S. given names dataset for the state of Texas
  // and saves results to permanent table.

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = 'my_dataset';
  // const tableId = 'my_table';

  // Create destination table reference
  const dataset = bigquery.dataset(datasetId);
  const destinationTable = dataset.table(tableId);

  const query = `SELECT name
    FROM \`bigquery-public-data.usa_names.usa_1910_2013\`
    WHERE state = 'TX'
    LIMIT 100`;

  // For all options, see https://cloud.google.com/bigquery/docs/reference/v2/tables#resource
  const options = {
    query: query,
    // Location must match that of the dataset(s) referenced in the query.
    location: 'US',
    destination: destinationTable,
  };

  // Run the query as a job
  const [job] = await bigquery.createQueryJob(options);

  console.log(`Job ${job.id} started.`);
  console.log(`Query results loaded to table ${destinationTable.id}`);
}

Python

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

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

כדי לשמור את תוצאות השאילתה בטבלה קבועה, יוצרים QueryJobConfig ומגדירים את destination ל-TableReference הרצוי. מעבירים את הגדרות המשימה לשיטת השאילתה.
from google.cloud import bigquery

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

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

job_config = bigquery.QueryJobConfig(destination=table_id)

sql = """
    SELECT corpus
    FROM `bigquery-public-data.samples.shakespeare`
    GROUP BY corpus;
"""

# Start the query, passing in the extra configuration.
query_job = client.query(sql, job_config=job_config)  # Make an API request.
query_job.result()  # Wait for the job to complete.

print("Query results loaded to the table {}".format(table_id))

כתיבת תוצאות גדולות של שאילתות

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

  • ב-GoogleSQL, מציינים טבלת יעד לתוצאות השאילתה.
  • ב-SQL מדור קודם, מציינים טבלת יעד ומגדירים את האפשרות allowLargeResults.

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

מגבלות

ב-SQL מדור קודם, כתיבת תוצאות גדולות כפופה למגבלות הבאות:

  • צריך לציין טבלת יעד.
  • אי אפשר לציין סעיף ORDER BY, TOP או LIMIT ברמה העליונה. פעולה כזו מבטלת את היתרון של השימוש ב-allowLargeResults, כי אי אפשר יותר לחשב את פלט השאילתה במקביל.
  • פונקציות אנליטיות יכולות להחזיר תוצאות שאילתה גדולות רק אם משתמשים בהן בשילוב עם משפט PARTITION BY.

כתיבת תוצאות גדולות באמצעות SQL מדור קודם

כדי לכתוב קבוצות גדולות של תוצאות באמצעות SQL מדור קודם:

המסוף

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

    כניסה ל-BigQuery

  2. לוחצים על Compose new query.

  3. מזינים שאילתת SQL תקינה באזור הטקסט של עורך השאילתות. משתמשים בקידומת #legacySQL או מוודאים שהאפשרות SQL מדור קודם מסומנת בהגדרות השאילתה.

  4. לוחצים על עריכה > הגדרות השאילתה.

    הגדרות השאילתה

  5. בקטע Destination, מסמנים את האפשרות Set a destination table for query results.

    הגדרת היעד

  6. בקטע Dataset, בוחרים את מערך הנתונים שבו תאוחסן הטבלה.

  7. בשדה Table Id, מזינים שם לטבלה.

  8. אם אתם כותבים קבוצת תוצאות גדולה לטבלה קיימת, אתם יכולים להשתמש באפשרויות של Destination table write preference כדי לשלוט בנטיית הכתיבה של טבלת היעד:

    • ‫Write if empty: כתיבת תוצאות השאילתה בטבלה רק אם הטבלה ריקה.
    • ‫Append to table: הוספת תוצאות השאילתה לטבלה קיימת.
    • ‫Overwrite table: החלפת טבלה קיימת עם אותו שם בתוצאות השאילתה.
  9. בקטע Results Size, מסמנים את האפשרות Allow large results (no size limit).

  10. אופציונלי: בשדה Data location, בוחרים את המיקום של הנתונים.

  11. לוחצים על שמירה כדי לעדכן את הגדרות השאילתה.

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

BQ

משתמשים בדגל --allow_large_results עם הדגל --destination_table כדי ליצור טבלת יעד שתכיל את קבוצת התוצאות הגדולה. מכיוון שהאפשרות --allow_large_results רלוונטית רק ל-SQL מדור קודם, צריך לציין גם את הדגל --use_legacy_sql=true. כדי לכתוב את תוצאות השאילתה בטבלה שלא נמצאת בפרויקט ברירת המחדל, מוסיפים את מזהה הפרויקט לשם של קבוצת הנתונים בפורמט הבא: PROJECT_ID:DATASET. מציינים את הדגל --location ומגדירים את הערך למיקום שלכם.

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

  • ‫--append_table: אם טבלת היעד קיימת, תוצאות השאילתה מצורפות אליה.
  • --replace: אם טבלת היעד קיימת, היא מוחלפת בתוצאות השאילתה.
bq --location=location query \
--destination_table PROJECT_ID:DATASET.TABLE \
--use_legacy_sql=true \
--allow_large_results "QUERY"

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

  • ‫LOCATION הוא שם המיקום שבו מעובדת השאילתה. הדגל --location הוא אופציונלי. לדוגמה, אם אתם משתמשים ב-BigQuery באזור טוקיו, אתם יכולים להגדיר את הערך של הדגל ל-asia-northeast1. אפשר להגדיר ערך ברירת מחדל למיקום באמצעות הקובץ .bigqueryrc.
  • ‫PROJECT_ID הוא מזהה הפרויקט.
  • ‫DATASET הוא השם של קבוצת הנתונים שמכילה את הטבלה שאליה כותבים את תוצאות השאילתה.
  • ‫TABLE הוא שם הטבלה שאליה כותבים את תוצאות השאילתה.
  • ‫QUERY היא שאילתה בתחביר SQL מדור קודם.

דוגמאות:

מזינים את הפקודה הבאה כדי לכתוב תוצאות גדולות של שאילתות לטבלת יעד בשם mytable ב-mydataset. מערך הנתונים נמצא בפרויקט שמוגדר כברירת מחדל. מכיוון שלא צוין בפקודה דגל של אופן הכתיבה, הטבלה חייבת להיות חדשה או ריקה. אחרת, תוחזר השגיאה Already exists. השאילתה מאחזרת נתונים ממערך הנתונים הציבורי USA Name Data. השאילתה הזו משמשת למטרות הדגמה בלבד. קבוצת התוצאות שמוחזרת לא חורגת מגודל התגובה המקסימלי.

bq query \
--destination_table mydataset.mytable \
--use_legacy_sql=true \
--allow_large_results \
"SELECT
  name,
  number
FROM
  [bigquery-public-data:usa_names.usa_1910_current]
WHERE
  gender = 'M'
ORDER BY
  number DESC"

מזינים את הפקודה הבאה כדי להשתמש בתוצאות של שאילתות גדולות כדי להחליף טבלת יעד בשם mytable ב-mydataset. מערך הנתונים נמצא ב-myotherproject, ולא בפרויקט ברירת המחדל. הפקודה משתמשת בדגל --replace כדי להחליף את טבלת היעד.

bq query \
--destination_table mydataset.mytable \
--replace \
--use_legacy_sql=true \
--allow_large_results \
"SELECT
  name,
  number
FROM
  [bigquery-public-data:usa_names.usa_1910_current]
WHERE
  gender = 'M'
ORDER BY
  number DESC"

מזינים את הפקודה הבאה כדי להוסיף תוצאות גדולות של שאילתות לטבלת יעד בשם mytable ב-mydataset. מערך הנתונים נמצא ב-myotherproject, ולא בפרויקט ברירת המחדל. הפקודה משתמשת בדגל --append_table כדי להוסיף את תוצאות השאילתה לטבלת היעד.

bq query \
--destination_table myotherproject:mydataset.mytable \
--append_table \
--use_legacy_sql=true \
--allow_large_results \
"SELECT
  name,
  number
FROM
  [bigquery-public-data:usa_names.usa_1910_current]
WHERE
  gender = 'M'
ORDER BY
  number DESC"

API

כדי לכתוב תוצאות גדולות בטבלת יעד, צריך להפעיל את השיטה jobs.insert, להגדיר משימת query ולהגדיר את המאפיין allowLargeResults כ-true. מציינים את טבלת היעד באמצעות המאפיין destinationTable. כדי לשלוט בנטיית הכתיבה של טבלת יעד קיימת, מגדירים את המאפיין writeDisposition.

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

המשך

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

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

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/bigquery"
	"google.golang.org/api/iterator"
)

// queryLegacyLargeResults demonstrates issuing a legacy SQL query and writing a large result set
// into a destination table.
func queryLegacyLargeResults(w io.Writer, projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "destinationdataset"
	// tableID := "destinationtable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	q := client.Query(
		"SELECT corpus FROM [bigquery-public-data:samples.shakespeare] GROUP BY corpus;")
	q.UseLegacySQL = true
	q.AllowLargeResults = true
	q.QueryConfig.Dst = client.Dataset(datasetID).Table(tableID)
	// Run the query and print results when the query job is completed.
	job, err := q.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}
	if err := status.Err(); err != nil {
		return err
	}
	it, err := job.Read(ctx)
	for {
		var row []bigquery.Value
		err := it.Next(&row)
		if err == iterator.Done {
			break
		}
		if err != nil {
			return err
		}
		fmt.Fprintln(w, row)
	}
	return nil
}

Java

כדי לאפשר תוצאות גדולות, מגדירים את allow large results ל-true ומגדירים את destination table ל-TableId הרצוי ב-QueryJobConfiguration.

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

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

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.TableId;
import com.google.cloud.bigquery.TableResult;

// Sample to run query with large results and save the results to a table.
public class QueryLargeResults {

  public static void runQueryLargeResults() {
    // TODO(developer): Replace these variables before running the sample.
    String destinationDataset = "MY_DESTINATION_DATASET_NAME";
    String destinationTable = "MY_DESTINATION_TABLE_NAME";
    String query = "SELECT corpus FROM [bigquery-public-data:samples.shakespeare] GROUP BY corpus;";
    queryLargeResults(destinationDataset, destinationTable, query);
  }

  public static void queryLargeResults(
      String destinationDataset, String destinationTable, 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();

      QueryJobConfiguration queryConfig =
          // To use legacy SQL syntax, set useLegacySql to true.
          QueryJobConfiguration.newBuilder(query)
              .setUseLegacySql(true)
              // Save the results of the query to a permanent table.
              .setDestinationTable(TableId.of(destinationDataset, destinationTable))
              // Allow results larger than the maximum response size.
              // If true, a destination table must be set.
              .setAllowLargeResults(true)
              .build();

      TableResult results = bigquery.query(queryConfig);

      results
          .iterateAll()
          .forEach(row -> row.forEach(val -> System.out.printf("%s,", val.toString())));

      System.out.println("Query large results performed successfully.");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Query not performed \n" + e.toString());
    }
  }
}

Node.js

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

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

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

async function queryLegacyLargeResults() {
  // Query enables large result sets.

  /**
   * TODO(developer): Uncomment the following lines before running the sample
   */
  // const projectId = "my_project"
  // const datasetId = "my_dataset";
  // const tableId = "my_table";

  const query = `SELECT word FROM [bigquery-public-data:samples.shakespeare] LIMIT 10;`;

  // For all options, see https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/query
  const options = {
    query: query,
    // Location must match that of the dataset(s) referenced
    // in the query and of the destination table.
    useLegacySql: true,
    allowLargeResult: true,
    destinationTable: {
      projectId: projectId,
      datasetId: datasetId,
      tableId: tableId,
    },
  };

  const [job] = await bigquery.createQueryJob(options);
  console.log(`Job ${job.id} started.`);

  // Wait for the query to finish
  const [rows] = await job.getQueryResults();

  // Print the results
  console.log('Rows:');
  rows.forEach(row => console.log(row));
}

Python

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

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

from google.cloud import bigquery

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

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

# Set the destination table and use_legacy_sql to True to use
# legacy SQL syntax.
job_config = bigquery.QueryJobConfig(
    allow_large_results=True, destination=table_id, use_legacy_sql=True
)

sql = """
    SELECT corpus
    FROM [bigquery-public-data:samples.shakespeare]
    GROUP BY corpus;
"""

# Start the query, passing in the extra configuration.
query_job = client.query(sql, job_config=job_config)  # Make an API request.
query_job.result()  # Wait for the job to complete.

print("Query results loaded to the table {}".format(table_id))

הורדה ושמירה של תוצאות שאילתות ממסוף Google Cloud

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

מגבלות

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

  • אפשר להוריד את תוצאות השאילתה באופן מקומי רק בפורמט CSV או בפורמט JSON שמופרד בשורות חדשות.
  • אי אפשר לשמור ב-Google Sheets תוצאות של שאילתות שמכילות נתונים חוזרים ומקוננים.
  • כדי לשמור תוצאות של שאילתות ב-Google Drive באמצעות מסוף Google Cloud , קבוצת התוצאות צריכה להיות בגודל של עד 1GB. אם התוצאות גדולות יותר, אפשר לשמור אותן בטבלה.
  • כששומרים את תוצאות השאילתה בקובץ CSV מקומי, גודל ההורדה המקסימלי הוא 10MB. גודל ההורדה המקסימלי מבוסס על הגודל של כל שורה שמוחזרת בתגובה ל-method‏ tabledata.list, והוא יכול להשתנות בהתאם לסכימה של תוצאות השאילתה. לכן, הגודל של קובץ ה-CSV שהורדתם יכול להשתנות, ויכול להיות שהוא יהיה קטן ממגבלת הגודל המקסימלית להורדה.
  • אפשר לשמור את תוצאות השאילתה ב-Google Drive רק בפורמט CSV או בפורמט JSON שמופרד בשורות חדשות.

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