如何使用 Python 将 bigquery 返回的结果转换为 Json 格式?

Posted

技术标签:

【中文标题】如何使用 Python 将 bigquery 返回的结果转换为 Json 格式?【英文标题】:How to convert results returned from bigquery to Json format using Python? 【发布时间】:2019-09-04 23:09:18 【问题描述】:

使用 Python 从 Bigquery 公共数据集中选择数据,得到结果后需要以 JSON 格式打印。如何将结果转换为 JSON?谢谢!

已尝试row[0],但出现错误。

try:
    raw_results = query.rows[0]
    zipped_results = zip(field_names, raw_results)
    results = x[0]: x[1] for x in zipped_results
except IndexError:
    results = None

# from google.cloud import bigquery
# client = bigquery.Client()

query = """
    SELECT word, word_count
    FROM `bigquery-public-data.samples.shakespeare`
    WHERE corpus = @corpus
    AND word_count >= @min_word_count
    ORDER BY word_count DESC;
"""
query_params = [
    bigquery.ScalarQueryParameter("corpus", "STRING", "romeoandjuliet"),
    bigquery.ScalarQueryParameter("min_word_count", "INT64", 250),
]
job_config = bigquery.QueryJobConfig()
job_config.query_parameters = query_params
query_job = client.query(
    query,
    # Location must match that of the dataset(s) referenced in the 
    query.location="US",
    job_config=job_config,
)  # API request - starts the query

# Print the results
for row in query_job:
    print(": \t".format(row.word, row.word_count))
assert query_job.state == "DONE"

【问题讨论】:

【参考方案1】:

您实际上可以让 BigQuery 直接生成 JSON。像这样更改您的查询:

query = """
SELECT TO_JSON_STRING(word, word_count) AS json
FROM `bigquery-public-data.samples.shakespeare`
WHERE corpus = @corpus
AND word_count >= @min_word_count
ORDER BY word_count DESC;
"""

现在结果将有一个名为 json 的列,并带有 JSON 格式的输出。

【讨论】:

【参考方案2】:

目前没有自动转换的方法,但是有一个非常简单的手动转换成json的方法:

records = [dict(row) for row in query_job]
json_obj = json.dumps(str(records))

另一种选择是使用 pandas 进行转换:

df = query_job.to_dataframe()
json_obj = df.to_json(orient='records')

【讨论】:

以上是关于如何使用 Python 将 bigquery 返回的结果转换为 Json 格式?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 bigquery 返回的结果转换为 Json

如何将 API 调用返回的数据直接加载到 BigQuery 中而不存储在 GCS 中?

如何使用 python 将字典写入 Dataflow 中的 Bigquery

如何在 bigquery 中使用 python 将数据添加到 RECORD 类型的列

如何使用 Apache Beam (Python) 将多个嵌套的 JSON 写入 BigQuery 表

Python 中的 Bigquery:如何将查询结果放入表中?