Google bigquery 将JSON文件从GCS加载到Bigquery表时出现数据类型问题
我在GCS中有JSON文件,我想导入到BQ表中,下面是代码,很简单: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
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对象添加到调用中,从而控制字段类型。