从GCS将JSON文件加载到Bigquery表时,数据类型出现问题

时间:2019-12-12 05:21:30

标签: google-bigquery google-cloud-storage

我在GCS中有JSON文件,我想导入到BQ表中,这是简单的代码:

job_config = bigquery.LoadJobConfig()
job_config.autodetect = True
job_config.create_disposition = 'CREATE_IF_NEEDED',
job_config.source_format = 'NEWLINE_DELIMITED_JSON',
job_config.write_disposition = 'WRITE_APPEND',
try:
    load_job = client.load_table_from_uri(
        uri,
        table_id,
        job_config=job_config,
    )
    print('Load job: %s [%s]' % (
        load_job.job_id,
        table_id
    ))
except Exception as e:
    logging.error('Failed to create load job: %s' % (e))

我遇到的问题是JSON文件中某些字段的值与数据类型不完全相同,例如:“ Weight”字段可能具有值“ 60kg”或“ 60”,因此某些记录是“不良记录” “,但是我想保留所有记录,是否可以保留所有记录,例如将所有字段的数据类型设置为String?

由于JSON文件中有100多个字段,因此BQ中的表是自动创建的,假设我手动创建所有字段为String的表,那么保留所有记录是否可行? 谢谢。

1 个答案:

答案 0 :(得分:0)

如@TamirKlein的评论中所述,由于某些列的值混合,因此自动检测将使用第一行来确定每列的适当数据类型。

如果您想要设置架构,使所有列都是字符串,但又不想对bigquery.SchemaField()的每一行进行硬编码,则可以使用Google Cloud Storage Client获取源文件并进行遍历第一个JSON对象的每个字段,同时将架构字段追加到列表中,然后使用它来确定表的架构配置。

您可以使用以下示例:

bucket = client.get_bucket('[BUCKET_NAME]')
blob = storage.Blob('source.json', bucket)

json_content = blob.download_as_string().decode("utf-8")
json_blobs = json_content.split('\n')
first_object = json.loads(json_blobs[0])

schema = []
for key in first_object:
    schema.append(bigquery.SchemaField(key, "STRING"))

job_config.schema = schema

请记住,如果源包含嵌套和重复的字段,则可能需要调整此逻辑。