将查询结果保存在 Cloud Storage 的 BigQuery 表中

Dav*_*osa 1 google-cloud-storage google-bigquery google-cloud-platform google-cloud-api-gateway google-cloud-vertex-ai

我想知道将 Google BigQuery 表查询结果存储到 Google Cloud 存储的最佳方式是什么。我的代码目前正在一些 Jupyter Notebook 中运行(在 Vertex AI Workbench 中,与 BigQuery 数据源以及 Cloud Storage 目标相同的项目),如下所示:

# CELL 1 OF 2

from google.cloud import bigquery
bqclient = bigquery.Client()

# The query string can vary:
query_string = """
        SELECT *  
        FROM `my_project-name.my_db.my_table` 
        LIMIT 2000000
        """

dataframe = (
    bqclient.query(query_string)
    .result()
    .to_dataframe(
        create_bqstorage_client=True,
    )
)
print("Dataframe shape: ", dataframe.shape)

# CELL 2 OF 2:

import pandas as pd
dataframe.to_csv('gs://my_bucket/test_file.csv', index=False)
Run Code Online (Sandbox Code Playgroud)

此代码大约需要 7.5 分钟才能成功完成。

是否有更优化的方法来实现上面所做的事情?(这意味着更快,但也许其他方面还可以改进)。

一些附加说明:

  1. 我想“通过 Jupyter Notebook”(在 Vertex AI Workbench 中)运行它,因为有时必须进行一些数据预处理或特殊过滤,而这无法通过 SQL 查询轻松完成。
  2. 对于代码的第一部分,我放弃了pandas.read_gbq,因为当(实验性地)“存储为 .CSV 并读回”时,它给了我一些奇怪的 EOF 错误。
  3. 直观上,我会将优化工作集中在代码的后半部分 ( CELL 2 OF 2),因为第一个部分是从Google 官方文档借用的。我已经尝试过这个,但它不起作用,但是在同一个线程中这个选项工作正常。
  4. 很可能此代码随后将包含在某些 Docker 映像中,因此必须使用“尽可能少的库”。

谢谢。

小智 5

使用导出数据语句:


EXPORT DATA OPTIONS(
  uri='gs://bucket/folder/*.csv',
  format='CSV',
  overwrite=true,
  header=true,
  field_delimiter=';') AS
SELECT *
FROM `my_project.my_db.my_table`
LIMIT 2000000

Run Code Online (Sandbox Code Playgroud)
  • URI 中的 * 允许将一个表导出到多个表中。仅当导出的表大于 1GB 时这才重要(请参见此处

直接在 BQ Console 中、通过命令行或在 Python 脚本中执行。

from google.cloud import bigquery

client = bigquery.Client()

query_job = client.query(
    """
    EXPORT DATA OPTIONS(
      uri='gs://bucket/folder/*.csv',
      format='CSV',
      overwrite=true,
      header=true,
      field_delimiter=';') AS
    SELECT *
    FROM `my_project.my_db.my_table`
    LIMIT 2000000
  """
)

results = query_job.result()  # Waits for job to complete.

Run Code Online (Sandbox Code Playgroud)

注意LIMIT:注意,这LIMIT不会减少非聚集表中读取的数据量。仅返回什么。(看这里