如何将 GCS 中的 csv 随机样本导出到 BigQuery
Posted
技术标签:
【中文标题】如何将 GCS 中的 csv 随机样本导出到 BigQuery【英文标题】:How do I export a random sample of a csv in GCS to BigQuery 【发布时间】:2021-06-07 15:18:55 【问题描述】:我正在使用位于 GCS 存储桶中的大型 CSV(400M+ 行)。我需要获取此 csv 的随机样本并将其导出到 BigQuery 以进行初步探索。我浏览了整个网络,但似乎找不到任何可以解决这个问题的东西。
这可能吗?我该怎么做?
【问题讨论】:
【参考方案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",因此它将忽略未完成的最后一行。
【讨论】:
以上是关于如何将 GCS 中的 csv 随机样本导出到 BigQuery的主要内容,如果未能解决你的问题,请参考以下文章
将 GCS 存储桶中的 .csv 文件中的数据加载到 Cloud SQL 表中:
Oracle OBIEE (BI):将不带隐藏列的分析结果导出到 CSV