【发布时间】:2021-06-07 15:18:55
【问题描述】:
我正在使用位于 GCS 存储桶中的大型 CSV(400M+ 行)。我需要获取此 csv 的随机样本并将其导出到 BigQuery 以进行初步探索。我浏览了整个网络,但似乎找不到任何可以解决这个问题的东西。
这可能吗?我该怎么做?
【问题讨论】:
标签: google-cloud-platform google-bigquery google-cloud-storage
我正在使用位于 GCS 存储桶中的大型 CSV(400M+ 行)。我需要获取此 csv 的随机样本并将其导出到 BigQuery 以进行初步探索。我浏览了整个网络,但似乎找不到任何可以解决这个问题的东西。
这可能吗?我该怎么做?
【问题讨论】:
标签: google-cloud-platform google-bigquery google-cloud-storage
您可以使用外部表查询您的 csv 文件 directly from BigQuery。
试试TABLESAMPLE 子句:
SELECT * FROM dataset.my_table TABLESAMPLE SYSTEM (10 PERCENT)
【讨论】:
你可以创建一个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% 的卷。
【讨论】:
没有直接的方法将样本记录从 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",因此它将忽略未完成的最后一行。
【讨论】: