背景
我有一个GA Premium帐户。我目前有以下流程设置:
我使用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()
提前致谢。
答案 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()