Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google bigquery 将JSON文件从GCS加载到Bigquery表时出现数据类型问题_Google Bigquery_Google Cloud Storage - Fatal编程技术网

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

Google bigquery 将JSON文件从GCS加载到Bigquery表时出现数据类型问题,google-bigquery,google-cloud-storage,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_APPEN

我在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

BQ中的表是自动创建的,因为JSON文件中有100多个字段,比如说,如果我用所有字段作为字符串手动创建表,那么保存所有记录是否有效?
谢谢。

正如@TamirKlein在评论中提到的,由于某些列的值是混合的,自动检测将使用第一行来确定每个列的适当数据类型

如果您想将模式设置为所有列都是字符串,但又不想硬编码
bigquery.SchemaField()
,则可以使用Google云存储客户端获取源文件,并在将模式字段添加到列表的同时遍历第一个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

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

删除代码的这一部分
job\u config.autodetect=True
,然后您可以通过创建表或向代码中添加
schema
对象来控制字段类型感谢您的回复,所以我必须定义每个字段的类型。对于一个包含100多个字段的JSON文件,有没有更好的方法来实现这一点?您的问题是一个字段中存在混合值,因此自动检测将拾取第一条记录。清除数据或提前创建表/将schema对象添加到调用中,从而控制字段类型。