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

במאמר הזה מוסבר איך לייצא את התוצאה של שאילתה שמופעלת על טבלת BigLake לקטגוריה של Amazon Simple Storage Service ‏ (Amazon S3).

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

מגבלות

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

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

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

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

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

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

SQL

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

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

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

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