首页 > 解决方案 > 将 JSON 文件从 GCS 加载到 Bigquery 表时出现数据类型问题

问题描述

我在 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文件中某些字段的值不是完全相同的数据类型,例如:“重量”字段的值可能是“60kg”或“60”,所以有些记录是“坏记录”,但是我想保留所有记录,是否可以保留所有记录,例如将所有字段的数据类型设置为String?

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

标签: google-bigquerygoogle-cloud-storage

解决方案


正如@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

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


推荐阅读