如何将公共数据集导入 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 BigQuery 通过 API 访问公共数据集
如何定期将大型 JSON 数据集导入 Cloud Firestore?
每次在 Google Cloud Storage 上上传 CSV 时如何触发自动更新 Google BigQuery 数据集