CSV数据中的自定义分隔符,同时将数据从BigQuery导出到GCS存储桶?

时间:2015-03-12 17:45:32

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

背景

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

  1. 来自GA帐户的原始数据流入BigQuery。
  2. 查询Bigquery表。
  3. 将查询结果导出到GCS存储桶。我以CSV和gzip格式导出它。
  4. 将CSV gzip压缩数据从GCS存储桶导出到我的Hadoop集群HDFS。
  5. 使用逗号作为字段分隔符,从群集上的数据生成配置单元表。
  6. 我使用BigQuery REST API以编程方式运行步骤1-3。

    问题:

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

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

    然而,问题是我想在步骤3中进行数据清理 - 同时导出到GCS。我查看了可以使用的可能的查询参数,但没有找到任何查询参数。可用于填充configuration.extract对象的可能参数列在:https://cloud.google.com/bigquery/docs/reference/v2/jobs#configuration.extract

    以下是将Bigquery表格导出到GCS存储区的代码片段。

    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()
    

    提前致谢。

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

使用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()