如何在 Bigquery 中插入一个接收 json 字符串值的字段?

Posted

技术标签:

【中文标题】如何在 Bigquery 中插入一个接收 json 字符串值的字段?【英文标题】:How to insert into Bigquery a field that is to recieve json string value? 【发布时间】:2017-07-14 05:11:28 【问题描述】:

在 Python 脚本中,我试图在 bigquery 表中插入一条记录。其中一个字段是将 Json 对象的值作为字符串接收。这是我用来执行此操作的代码:

query = "INSERT into config.job_config  ( job_name, run_id, task_name, task_step, run_config, version, run_time) VALUES (" + "'" + self.job_name + "', '" + self.run_id + "', '"+self.task_name + "', '"+ task_step + "', '"+ json.dumps(configy) +"', '" + self.config_version+ "', CURRENT_TIMESTAMP() "+")"
print query
query_job = self.bq_client.run_sync_query(query)
query_job.timeout_ms = 60000
query_job.run()

以下是生成的“打印查询”语句:

INSERT into config.job_config  ( job_name, run_id, task_name, task_step, run_config, version, run_time) VALUES ('copy:temp.test_lines', 'run-id-123', 'BQLoadGcsFile', '1', '"gcs": "landing_bucket": "gs://test-development", "landing_dir": "/lineitems/", "archive_bucket": "gs://test-development", "archive_dir": "/archive/", "gcs_to_bq_job_id": "test_lines-run-id-123-2017-07-13"', '3.0', CURRENT_TIMESTAMP() )

当我在 UI 中执行插入语句时,它工作正常。但是,当上面的代码执行时,会产生如下错误:

File "/home/fereshteh/utils/scheduler_config.py", line 87, in insert_task_instance_config
query_job.run()
File "/home/fereshteh/google-cloud-env/local/lib/python2.7/site-packages/google/cloud/bigquery/query.py", line 364, in run
method='POST', path=path, data=self._build_resource())
File "/home/fereshteh/google-cloud-env/local/lib/python2.7/site-packages/google/cloud/_http.py", line 303, in api_request
error_info=method + ' ' + url)
google.cloud.exceptions.BadRequest: 400 Encountered "" at line 1, column 43.
[Try using standard SQL 
(https://cloud.google.com/bigquery/docs/reference/standard-sql/enabling-standard-sql)] (POST https://www.googleapis.com/bigquery/v2/projects/sansar-dev/queries)

当我添加“query.use_legacy_sql = False”(来自https://googlecloudplatform.github.io/google-cloud-python/stable/bigquery-usage.html#querying-data-synchronous)时:

query_job = self.bq_client.run_sync_query(query)
query_job.timeout_ms = 60000
query.use_legacy_sql = False
query_job.run()

它给出以下错误:

    query.use_legacy_sql = False     
    AttributeError: 'str' object has no attribute 'use_legacy_sql'

感谢任何帮助

【问题讨论】:

【参考方案1】:

query 是您的查询字符串而不是作业。看起来应该是:

query_job = self.bq_client.run_sync_query(query)
query_job.timeout_ms = 60000
query_job.use_legacy_sql = False
query_job.run()

【讨论】:

谢谢。但是,我发帖的真正原因(在被遗留问题转移之前)是如何在读取和写回 BQ 记录时处理转义字符。在第一个插入(这是手动的)中,所有像单引号(我使用 " 表示字符串字段)或 \ 之类的字符都必须转义才能插入工作。但随后脚本读取记录和包含 json 的 fld(使用json.loads),然后它必须再次将该记录插入BQ,这次用于转义的“\”字符全部消失(由json.loads),这在尝试插入记录时会导致错误。任何建议? 当然,抱歉,我之前没有看到您的其他问题。您最好的选择可能是使用 Python 三引号("""<query>""" 或使用单引号),或者您可以从文件中加载查询,这样您就不必担心转义了。

以上是关于如何在 Bigquery 中插入一个接收 json 字符串值的字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 bigquery 中转储具有未知内容的 json?

BigQuery 流式插入如何计费?

使用 cdata ado.net 数据提供程序在 Google BigQuery 中插入 Json

如何在展平嵌套字段后将数据​​从一个 bigquery 表流式插入到另一个表?

解析 json 文件以获取要插入 bigquery 的正确列

使用 Nifi 将带有数组的 json 插入 BigQuery 的问题