如何将 public 数据集导入 Google Cloud Bucket

How to import public data set into Google Cloud Bucket

我将处理包含有关美国 311 呼叫信息的数据集。此数据集在 BigQuery 中 public 可用。我想将其直接复制到我的存储桶中。但是,我是新手,不知道该怎么做。

这是 Google 云上数据集 public 位置的屏幕截图:

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

如果您 select 左侧列表中的 311_service_requests table,将出现 "Export" 按钮:

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

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

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

编辑:

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

为避免这种情况,您应该通过将 print_header 参数设置为 False:

来执行 BigQuery Export
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 文件中根本没有 header。如果您仍然需要列名出现在第一行中,您必须创建另一个包含列名的 CSV 文件并创建这两个文件的组合。这可以通过将以下内容(“311_service_requests”table 的列名称)粘贴到新文件中来手动完成:

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 脚本(如果您想将它与具有大量很难手动完成的列的 table 一起使用)查询列名table 并将它们写入 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

如果您想要 headers,您可以跳过创建第一个复合材料并使用所有来源创建最后一个复合材料:

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

您还可以使用 gcoud 命令:

  1. 创建存储桶:

    gsutil mb gs://my-bigquery-temp  
    
  2. 提取数据集:

    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*,因为数据集太大,无法导出到单个文件。

  1. 检查桶:

    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 问题