如何将GCS中csv的随机样本导出到BigQuery



我正在处理GCS铲斗中的一个大型CSV(400M+行(。我需要获得这个csv的随机样本,并将其导出到BigQuery进行初步探索。我在网上找了很多,但似乎找不到任何能解决这个问题的东西。

这可能吗?我该怎么做?

您可以使用外部表直接从BigQuery查询csv文件。

试试TABLESAMPLE子句:

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

您可以从GCS创建一个外部表格(直接从GCS读取(,然后执行类似的操作

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

选择结果可以通过导出存储在GCS中,也可以通过insert select存储在表格中

请记住,您需要完全加载文件(从而支付整个文件大小的费用(,然后查询文件的子集。您不能在BigQuery中只加载10%的卷。

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

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文件中下载2kb的数据,但是下载的csv文件中的最后一行可能不完整,因为我们无法定义每行的字节。这里更棘手的部分是"max_ bad_,因此它将忽略未完成的最后一行。

最新更新