如何将公共数据集导入 Google Cloud Bucket

Posted

技术标签:

【中文标题】如何将公共数据集导入 Google Cloud Bucket【英文标题】:How to import public data set into Google Cloud Bucket 【发布时间】:2019-12-18 05:20:03 【问题描述】:

我将处理一个包含美国 311 电话信息的数据集。此数据集在 BigQuery 中公开可用。我想直接将它复制到我的存储桶中。但是,作为新手,我对如何执行此操作一无所知。

这是数据集在 Google Cloud 上的公共位置的屏幕截图:

我已经在我的 Google Cloud Storage 中创建了一个名为 311_nyc 的存储桶。如何直接传输数据而无需下载 12 GB 文件并通过我的 VM 实例再次上传?

【问题讨论】:

【参考方案1】:

如果您从左侧列表中选择311_service_requests 表,则会出现一个“导出”按钮:

然后您可以选择Export to GCS,选择您的存储桶,输入文件名,选择格式(在 CSV 和 JSON 之间)并检查您是否要压缩导出文件 (GZIP)。

但是,BigQuery Exports 中有一些limitations。从适用于您的案例的文档链接中复制一些内容:

您最多可以将 1 GB 的表数据导出到单个文件中。如果要导出超过 1 GB 的数据,请使用通配符将数据导出到多个文件中。当您将数据导出到多个文件时,文件的大小会有所不同。 以 JSON 格式导出数据时,INT64(整数)数据类型被编码为 JSON 字符串,以在其他系统读取数据时保持 64 位精度。 使用 Cloud Console 或经典 BigQuery 网页界面导出数据时,您不能选择 GZIP 以外的压缩类型。

编辑:

将输出文件合并在一起的简单方法是使用gsutil compose 命令。但是,如果您这样做,带有列名的标题将在结果文件中出现多次,因为它出现在从 BigQuery 提取的所有文件中。

为避免这种情况,您应该通过将 print_header 参数设置为 False 来执行 BigQuery 导出:

bq extract --destination_format CSV --print_header=False bigquery-public-data:new_york_311.311_service_requests gs://<YOUR_BUCKET_NAME>/nyc_311_*.csv

然后创建复合:

gsutil compose gs://<YOUR_BUCKET_NAME>/nyc_311_* gs://<YOUR_BUCKET_NAME>/all_data.csv

现在,all_data.csv 文件中根本没有标题。如果您仍然需要列名出现在第一行,您必须创建另一个包含列名的 CSV 文件并创建这两者的组合。这可以通过将以下(“311_service_requests”表的列名)粘贴到新文件中来手动完成:

unique_key,created_date,closed_date,agency,agency_name,complaint_type,descriptor,location_type,incident_zip,incident_address,street_name,cross_street_1,cross_street_2,intersection_street_1,intersection_street_2,address_type,city,landmark,facility_type,status,due_date,resolution_description,resolution_action_updated_date,community_board,borough,x_coordinate,y_coordinate,park_facility_name,park_borough,bbl,open_data_channel_type,vehicle_type,taxi_company_borough,taxi_pickup_location,bridge_highway_name,bridge_highway_direction,road_ramp,bridge_highway_segment,latitude,longitude,location

或使用以下简单的 Python 脚本(如果您想将它与具有大量列且难以手动完成的表一起使用)查询表的列名并将它们写入 CSV 文件:

from google.cloud import bigquery

client = bigquery.Client()

query = """
    SELECT column_name
    FROM `bigquery-public-data`.new_york_311.INFORMATION_SCHEMA.COLUMNS
    WHERE table_name='311_service_requests'
"""
query_job = client.query(query)

columns = []
for row in query_job:
    columns.append(row["column_name"])
with open("headers.csv", "w") as f:
    print(','.join(columns), file=f) 

请注意,要运行上述脚本,您需要安装 BigQuery Python 客户端库:

pip install --upgrade google-cloud-bigquery 

headers.csv 文件上传到您的存储桶:

gsutil cp headers.csv gs://<YOUR_BUCKET_NAME/headers.csv

现在您已准备好创建最终的组合:

gsutil compose gs://<YOUR_BUCKET_NAME>/headers.csv gs://<YOUR_BUCKET_NAME>/all_data.csv gs://<YOUR_BUCKET_NAME>/all_data_with_headers.csv

如果您想要标题,您可以跳过创建第一个组合,而只使用所有源创建最后一个:

gsutil compose gs://<YOUR_BUCKET_NAME>/headers.csv gs://<YOUR_BUCKET_NAME>/nyc_311_*.csv gs://<YOUR_BUCKET_NAME>/all_data_with_headers.csv

【讨论】:

您好,感谢您的回答。如果我使用通配符,我如何能够将这些文件组合成一个我可以有效处理的文件? @KaustubhMulay 我已经编辑了我的答案,提供了尽可能多的细节。如果您有任何问题,请告诉我。 非常感谢您的详细回答。我感谢你。如果我有任何问题,我一定会让你知道。再次感谢!! @KaustubhMulay 既然很有帮助,如果你能接受我的回答就好了! 完成。有没有办法将 blob 限制为 32 个?【参考方案2】:

您也可以使用 gcoud 命令:

    创建一个桶:

    gsutil mb gs://my-bigquery-temp  
    

    提取数据集:

    bq extract --destination_format CSV --compression GZIP 'bigquery-public-data:new_york_311.311_service_requests' gs://my-bigquery-temp/dataset*
    

请注意,您必须使用gs://my-bigquery-temp/dataset*,因为数据集太大,无法导出到单个文件。

    检查桶:

    gsutil ls gs://my-bigquery-temp
    
    gs://my-bigquery-temp/dataset000000000
    
    ......................................
    
    gs://my-bigquery-temp/dataset000000000045
    

    您可以找到更多信息Exporting table data

编辑:

要从导出的数据集文件中组合对象,您可以使用 gsutil 工具:

 gsutil compose gs://my-bigquery-temp/dataset*  gs://my-bigquery-temp/composite-object

请记住,您不能使用超过 32 个 blob(文件)来组合对象。

相关SO问题Google Cloud Storage Joining multiple csv files

【讨论】:

您好,感谢您的回答。如果我使用通配符,我如何能够将这些文件组合成一个我可以有效处理的文件?

以上是关于如何将公共数据集导入 Google Cloud Bucket的主要内容,如果未能解决你的问题,请参考以下文章

我如何将变量传递给Google Cloud函数

Google BigQuery 通过 API 访问公共数据集

如何定期将大型 JSON 数据集导入 Cloud Firestore?

访问 BigQuery 上的公共数据集

每次在 Google Cloud Storage 上上传 CSV 时如何触发自动更新 Google BigQuery 数据集

我们如何将大型数据集从 Google BigQuery 导入 R?