【问题标题】:Custom Delimiters in CSV Data while exporting data from BigQuery to GCS bucket?将数据从 BigQuery 导出到 GCS 存储桶时,CSV 数据中的自定义分隔符?
【发布时间】:2015-05-15 00:30:33
【问题描述】:

背景:

我有一个 GA 高级帐户。我目前有以下流程设置:

  1. 来自 GA 帐户的原始数据流入 BigQuery。
  2. 查询 Bigquery 表。
  3. 将查询结果导出到 GCS 存储桶。我以 CSV 和 gzip 格式导出它。
  4. 将 CSV 压缩后的数据从 GCS 存储桶导出到我的 Hadoop 集群 HDFS。
  5. 使用逗号作为字段分隔符,从集群上的数据生成 hive 表。

我使用 BigQuery REST API 以编程方式运行步骤 1-3。

问题:

我的数据在某些字段的引号中包含嵌入的逗号和换行符。当我生成我的 hive 表时,嵌入的逗号和换行符会导致我的字段值发生变化,或者导致 hive 表中的记录出现空值。

我想通过删除这些嵌入的逗号和换行符或将它们替换为引号内的自定义分隔符来清理数据。

但是,问题是我想在第 3 步执行此数据清理 - 同时导出到 GCS。我查看了可以用来实现此目的的可能查询参数,但没有找到。可用于填充 configuration.extract 对象的可能参数列在:https://cloud.google.com/bigquery/docs/reference/v2/jobs#configuration.extract

这是将数据从 Bigquery 表导出到 GCS 存储桶的代码的 sn-p。

query_request = bigquery_service.jobs()

DATASET_NAME = "#######";
PROJECT_ID = '#####';
DATASET_ID = 'DestinationTables';

DESTINATION_PATH = 'gs://bucketname/foldername/'
query_data = {
'projectId': '#####',
'configuration': {
  'extract': {
    'sourceTable': {
            'projectId': PROJECT_ID,
            'datasetId': DATASET_ID,
            'tableId': #####,
     },
    'destinationUris': [DESTINATION_PATH + my-files +'-*.gz'],
    'destinationFormat': 'CSV',
    'printHeader': 'false',
    'compression': 'GZIP'
   }
 }
}

query_response = query_request.insert(projectId=constants.PROJECT_NUMBER,
                                     body=query_data).execute()

提前致谢。

【问题讨论】:

    标签: google-bigquery google-cloud-storage export-to-csv


    【解决方案1】:

    编辑:看起来我误解了你的问题。您想修改这些值以不包括逗号和换行符。我认为您的问题只是逗号,解决方法是不使用逗号作为分隔符。

    需要明确的是,导出时无法进行修改。您将需要运行另一个查询来生成一个新表。

    例子:

    SELECT x, y, z,
        REGEXP_REPLACE(
            REGEXP_REPLACE(
                REGEXP_REPLACE(bad_data, '%', '%45'),
                '\n', '%20'
            )
            ',', '%54'
    ) FROM ds.tbl
    

    这将以查询字符串兼容的格式对 bad_data 字段进行编码。如有必要,请记住使用 large results enabled 运行此查询。

    如果您以后不想手动解码,java.net.URLDecoder 或类似的东西应该能够解码。


    您可以设置导出对象的字段分隔符。

    https://cloud.google.com/bigquery/docs/reference/v2/jobs#configuration.extract.fieldDelimiter

    query_request = bigquery_service.jobs()
    
    DATASET_NAME = "#######";
    PROJECT_ID = '#####';
    DATASET_ID = 'DestinationTables';
    
    DESTINATION_PATH = 'gs://bucketname/foldername/'
    query_data = {
    'projectId': '#####',
    'configuration': {
      'extract': {
        'sourceTable': {
                'projectId': PROJECT_ID,
                'datasetId': DATASET_ID,
                'tableId': #####,
         },
        'destinationUris': [DESTINATION_PATH + my-files +'-*.gz'],
        'destinationFormat': 'CSV',
        'fieldDelimiter': '~',
        'printHeader': 'false',
        'compression': 'GZIP'
       }
     }
    }
    
    query_response = query_request.insert(projectId=constants.PROJECT_NUMBER,
                                         body=query_data).execute()
    

    【讨论】:

    • 嗨,斯蒂芬。这是为字段设置 fieldDelimiter 对吗?不适用于带有嵌入逗号和换行符的字段值?如果我在这里错了,请纠正我。如果它只是为字段设置分隔符,那么由于我已将目标格式指定为 CSV,这是如何工作的?是用逗号还是~分隔?
    【解决方案2】:

    使用 Python:

    from google.cloud import bigquery 
    client = bigquery.Client()
    
    bucket_name = 'my-bucket' 
    project = 'bigquery-public-data' 
    dataset_id = 'samples' 
    table_id = 'shakespeare'
    
    destination_uri = 'gs://{}/{}'.format(bucket_name, 'shakespeare.csv') 
    dataset_ref = client.dataset(dataset_id, project=project) 
    table_ref = dataset_ref.table(table_id)
    
    job_config = bigquery.ExtractJobConfig() 
    job_config.field_delimiter = ';'
    
    extract_job = client.extract_table(
            table_ref,
            destination_uri,
            # Location must match that of the source table.
            location='US')  # API request 
    
    extract_job.result()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 2015-04-04
      • 2021-05-08
      • 2021-10-18
      • 2015-04-30
      相关资源
      最近更新 更多