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

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

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

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

【问题讨论】:

    标签: google-bigquery export google-cloud-storage bucket


    【解决方案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 命令:

    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问题Google Cloud Storage Joining multiple csv files

    【讨论】:

    • 您好,感谢您的回答。如果我使用通配符,我如何能够将这些文件组合成一个我可以有效处理的文件?
    猜你喜欢
    • 2012-02-17
    • 2014-11-14
    • 2021-01-15
    • 2016-08-13
    • 2019-03-17
    • 1970-01-01
    • 2018-10-16
    • 2015-04-13
    相关资源
    最近更新 更多