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

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

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

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

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

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

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

      כניסה ל-BigQuery

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

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

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

    3. בחלונית Explorer, לוחצים על Job history (היסטוריית המשימות).

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

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

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

  • אי אפשר לשתף טבלאות זמניות, והן לא מוצגות באמצעות אף אחת מהשיטות הרגילות של רשימות או של שינוי טבלאות. אם אתם צריכים לשתף את תוצאות השאילתה, כתבו את התוצאות בטבלה קבועה, הורידו אותן או שתפו אותן באמצעות 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 במסוף Cloud de Confiance .

    לדף BigQuery

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

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

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

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

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

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

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

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

    הגדרת היעד

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

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

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

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

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

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

SQL

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

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

    כניסה ל-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 de Confiance , מפעילים את Cloud Shell.

    הפעלת Cloud Shell

    בחלק התחתון של Cloud de Confiance המסוף יתחיל סשן של 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.

      אם לא מצוין דגל של פעולת כתיבה, התנהגות ברירת המחדל היא כתיבת התוצאות לטבלה רק אם היא ריקה. אם הטבלה קיימת והיא לא ריקה, השגיאה הבאה מוחזרת: 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

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

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

המשך

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

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

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

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. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

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

כדי לשמור את תוצאות השאילתה בטבלה קבועה, מגדירים את טבלת היעד ל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. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

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

// 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. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

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

כדי לשמור את תוצאות השאילתה בטבלה קבועה, יוצרים QueryJobConfig ומגדירים את היעד ל-TableReference הרצוי. מעבירים את הגדרות המשימה אל השיטה query.
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, כי אי אפשר יותר לחשב את פלט השאילתה במקביל.
  • פונקציות אנליטיות (window functions) יכולות להחזיר תוצאות גדולות של שאילתות רק אם משתמשים בהן בשילוב עם סעיף PARTITION BY.

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

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

המסוף

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

    כניסה ל-BigQuery

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

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

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

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

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

    הגדרת היעד

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

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

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

    • ‫Write if empty: כתיבת תוצאות השאילתה בטבלה רק אם הטבלה ריקה.
    • הוספה לטבלה: הוספה של תוצאות השאילתה לטבלה קיימת.
    • החלפת טבלה: מחליפה טבלה קיימת עם אותו שם בתוצאות השאילתה.
  9. בקטע גודל התוצאות, מסמנים את התיבה אפשר תוצאות גדולות (ללא הגבלת גודל).

  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. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

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

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. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה 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.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. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

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

// 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. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

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

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))

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

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

מגבלות

ההגבלות הבאות חלות על הורדה ושמירה של תוצאות שאילתה:

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

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