ייצוא תוצאות של שאילתות ל-Amazon S3

בעזרת BigQuery אתם יכולים לייצא את התוצאות של שאילתה שפועלת על טבלת BigLake ישירות לקטגוריה של Amazon Simple Storage Service (Amazon S3) באמצעות ההצהרה EXPORT DATA. ייצוא של תוצאות השאילתות מאפשר לכם לאחסן נתונים מעובדים ולהשתמש בהם באחסון החיצוני בענן, בלי להעביר את התוצאות דרך האחסון ב-BigQuery.

במאמר זרימת הנתונים כשמייצאים נתונים מוסבר איך הנתונים זורמים בין BigQuery לבין Amazon S3.

מגבלות

רשימה מלאה של המגבלות שחלות על טבלאות BigLake שמבוססות על Amazon S3 ו-Blob Storage מופיעה בקטע מגבלות.

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

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

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

‫BigQuery Omni כותב למיקום שצוין ב-Amazon S3, בלי קשר לתוכן שכבר קיים. שאילתת הייצוא יכולה להחליף נתונים קיימים או לשלב את תוצאת השאילתה עם נתונים קיימים. מומלץ לייצא את תוצאת השאילתה לקטגוריה ריקה ב-Amazon S3.

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

SQL

בשדה עורך השאילתות, מזינים שאילתת ייצוא ב-GoogleSQL. ‫GoogleSQL הוא תחביר ברירת המחדל במסוף Google Cloud .

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

    כניסה ל-BigQuery

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

       EXPORT DATA WITH CONNECTION `CONNECTION_REGION.CONNECTION_NAME`
       OPTIONS(uri="s3://BUCKET_NAME/PATH", format="FORMAT", ...)
       AS QUERY

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

    • ‫CONNECTION_REGION: האזור שבו נוצר החיבור.
    • ‫CONNECTION_NAME: שם החיבור שיצרתם עם ההרשאה הנדרשת לכתיבה בקטגוריה של Amazon S3.
    • ‫BUCKET_NAME: הקטגוריה ב-Amazon S3 שבה רוצים לכתוב את הנתונים.
    • ‫PATH: הנתיב שבו רוצים לכתוב את הקובץ שיוצא. הוא חייב להכיל בדיוק תו כללי אחד לחיפוש * בכל מקום בספריית העלה של מחרוזת הנתיב, לדוגמה, ../aa/*,‏ ../aa/b*c,‏ ../aa/*bc ו-../aa/bc*. ‫BigQuery מחליף את * ב-0000..N בהתאם למספר הקבצים שיוצאו. ‫BigQuery קובע את מספר הקבצים ואת הגודל שלהם. אם BigQuery מחליט לייצא שני קבצים, אז * בשם הקובץ הראשון מוחלף ב-000000000000, ו-* בשם הקובץ השני מוחלף ב-000000000001.
    • ‫FORMAT: הפורמטים הנתמכים הם JSON,‏ AVRO,‏ CSV ו-PARQUET.
    • ‫QUERY: השאילתה לניתוח הנתונים שמאוחסנים בטבלת BigLake. קבוצת הנתונים שמכילה את טבלת BigLake שמשמשת בשאילתה חייבת להיות באותו אזור ב-Amazon S3 שבו נמצאת קטגוריית היעד ב-Amazon S3.

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

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

Java

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

// Sample to export query results to Amazon S3 bucket
public class ExportQueryResultsToS3 {

  public static void main(String[] args) throws InterruptedException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String datasetName = "MY_DATASET_NAME";
    String externalTableName = "MY_EXTERNAL_TABLE_NAME";
    // connectionName should be in the format of connection_region.connection_name. e.g.
    // aws-us-east-1.s3-write-conn
    String connectionName = "MY_CONNECTION_REGION.MY_CONNECTION_NAME";
    // destinationUri must contain exactly one * anywhere in the leaf directory of the path string
    // e.g. ../aa/*, ../aa/b*c, ../aa/*bc, and ../aa/bc*
    // BigQuery replaces * with 0000..N depending on the number of files exported.
    // BigQuery determines the file count and sizes.
    String destinationUri = "s3://your-bucket-name/*";
    String format = "EXPORT_FORMAT";
    // Export result of query to find states starting with 'W'
    String query =
        String.format(
            "EXPORT DATA WITH CONNECTION `%s` OPTIONS(uri='%s', format='%s') "
              + "AS SELECT * FROM %s.%s.%s WHERE name LIKE 'W%%'",
            connectionName, destinationUri, format, projectId, datasetName, externalTableName);
    exportQueryResultsToS3(query);
  }

  public static void exportQueryResultsToS3(String query) throws InterruptedException {
    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();

      TableResult results = bigquery.query(QueryJobConfiguration.of(query));

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

      System.out.println("Query results exported to Amazon S3 successfully.");
    } catch (BigQueryException e) {
      System.out.println("Query not performed \n" + e.toString());
    }
  }
}

פתרון בעיות

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

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