我在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的表,那么保留所有记录是否可行? 谢谢。
答案 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
请记住,如果源包含嵌套和重复的字段,则可能需要调整此逻辑。