【问题标题】:How do I export a random sample of a csv in GCS to BigQuery如何将 GCS 中的 csv 随机样本导出到 BigQuery
【发布时间】:2021-06-07 15:18:55
【问题描述】:

我正在使用位于 GCS 存储桶中的大型 CSV(400M+ 行)。我需要获取此 csv 的随机样本并将其导出到 BigQuery 以进行初步探索。我浏览了整个网络,但似乎找不到任何可以解决这个问题的东西。

这可能吗?我该怎么做?

【问题讨论】:

    标签: google-cloud-platform google-bigquery google-cloud-storage


    【解决方案1】:

    您可以使用外部表查询您的 csv 文件 directly from BigQuery

    试试TABLESAMPLE 子句:

    SELECT * FROM dataset.my_table TABLESAMPLE SYSTEM (10 PERCENT)
    

    【讨论】:

    • 这仅适用于表已经在 bigquery 中的情况。我想将存储桶中的样本导出到 bigquery。例如,我不想将所有 400M 行导出到 bigquery,而是导出 1000 个随机行
    • 外部表不存储在 BigQuery 中。它们允许查询存储在 CloudStorage without copying data to BigQuery 中的数据。
    【解决方案2】:

    你可以创建一个external table from GCS (to read directly from GCS),然后做类似的事情

    SELECT * FROM `<project>.<dataset>.<externalTableFromGCS>` 
    WHERE CAST(10*RAND() AS INT64) = 0
    

    选择的结果可以存储在GCS with an export中,也可以存储在带有insert select的表中

    请记住,您需要完全加载文件(因此要为整个文件大小付费),然后查询文件的子集。您不能在 BigQuery 中仅加载 10% 的卷。

    【讨论】:

      【解决方案3】:

      没有直接的方法将样本记录从 GCS 加载到 BigQuery,但我们可以通过不同的方式实现,在 GCS 中,我们可以选择仅下载特定的文件块,因此以下简单的 python 代码可以将样本记录加载到 BQ来自大型 GCS 文件

      from google.cloud import storage
      from google.cloud import bigquery
      
      gcs_client = storage.Client()
      bq_client = bigquery.Client()
      
      job_config = bigquery.LoadJobConfig(source_format='CSV', autodetect=True, max_bad_records=1)
      
      bucket = gcs_client.get_bucket("your-bucket")
      blob = storage.Blob('gcs_path/file.csv', bucket)
          
      with open('local_file.csv', 'wb') as f:    # downloading sample file
          gcs_client.download_blob_to_file(blob, f, start=0, end=2000)
      
      with open('local_file.csv', "rb") as source_file:   # uploading to BQ
          job = bq_client.load_table_from_file(source_file, 'your-proj.dataset.table_id', job_config=job_config)
      
      job.result() # Wait for loading
      

      在上面的代码中,它会从你巨大的 GCS 文件中下载 2 kb 的数据,但是 下载的 csv 文件中的最后一行可能不完整,因为我们无法为每行定义字节。这里比较棘手的部分是 bq 作业配置中的 "max_bad_records=1",因此它将忽略未完成的最后一行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-27
        • 1970-01-01
        • 2020-01-18
        • 2018-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多