Python 更快地解析BigQuery JSON结果

Python 更快地解析BigQuery JSON结果,python,json,google-bigquery,Python,Json,Google Bigquery,我正在构建一个使用BigQuery作为数据源的API。我们在数据存储、分区和查询优化方面做了大量的工作,但是,我在高效解析查询结果方面遇到了一些问题。例如,在某些情况下,有50多行JSON,我看到解析需要3秒或更长时间,这在查询执行和HTTP请求/响应之上远远不够理想 下面是我使用公共BigQuery数据集所做工作的简化版本,我的查询要复杂得多,但是,解析是相同的,这正是我需要一些帮助的地方 from google.cloud import bigquery import json sql =

我正在构建一个使用BigQuery作为数据源的API。我们在数据存储、分区和查询优化方面做了大量的工作,但是,我在高效解析查询结果方面遇到了一些问题。例如,在某些情况下,有50多行JSON,我看到解析需要3秒或更长时间,这在查询执行和HTTP请求/响应之上远远不够理想

下面是我使用公共BigQuery数据集所做工作的简化版本,我的查询要复杂得多,但是,解析是相同的,这正是我需要一些帮助的地方

from google.cloud import bigquery
import json

sql = """
SELECT TO_JSON_STRING(t) FROM (
SELECT * FROM
`bigquery-public-data.hacker_news.stories`
LIMIT 50 OFFSET 0
) as t
"""

client = bigquery.Client()
job_config = bigquery.QueryJobConfig()
query_job = client.query(sql,job_config=job_config)
results = query_job.result()

# Begin parsing results to valid
# JSON for API response
json_response = '['
i = 0
for row in results:
    json_response = json_response + row[0]
    if i != total_rows:
        json_response = json_response + ","
    i += 1

json_response = json_response + ']'    

print(json_response)
我试着按照上面列出的一些性能提示去做,但是不断地遇到我无法克服的错误

注意:我是Python新手,在过去几年中一直使用Ruby编写代码

编辑: 我尝试了几种构建JSON响应的替代方法,针对Micah的评论,我运行了一些分析,结果如下

第1版(原件同上)

生成响应的平均时间=1.7962s

版本2

json_list = [ json.loads(row[0]) for row in results]
json_response = json.dumps(json_list)
生成响应的平均时间=2.4789s

我猜json.loads和json.dumps会在这里增加延迟

第3版(根据迈卡的建议)

生成响应的平均时间=1.9623s


我更喜欢V2&3的代码,但V1仍然是最快的方法,尽管速度很慢

我通常是这样做的:

from google.cloud import bigquery
import json


# BigQuery Setup and Query
project_name = 'my_project'
client = bigquery.Client(project=project_name)
query = 'select to_json_string(t) as my_stuff from schema.dataset'

job_config = bigquery.QueryJobConfig()
job_config.use_query_cache = False
query_job = client.query(query, job_config = job_config)

results = query_job.result()

json_list = []

for row in results:
    json_list.append(row.my_stuff)

with open('data.json', 'w') as f:
    json.dump(json_list,f)


如果需要字段名或多个字段,请使用
to_json_string(struct(t))
to_json_string(struct(a、b、c)作为值))

大型json数据来自何处?它是来自存储JSON的特定列,还是作为示例查询,您形成了一个JSON以从BigQuery返回。解决方案可以不同。它与后一个/第二个选项不同。该表有许多列,使用TO_JSON_STRING()命令返回JSON行。这可能有助于进行更多分析。
a=[row[0]对于结果中的行]
需要多长时间?加入(a)需要多长时间?无论哪种情况,Join都应该比当前循环更快
a = [row[0] for row in results]
json_response = ",".join(a) 
from google.cloud import bigquery
import json


# BigQuery Setup and Query
project_name = 'my_project'
client = bigquery.Client(project=project_name)
query = 'select to_json_string(t) as my_stuff from schema.dataset'

job_config = bigquery.QueryJobConfig()
job_config.use_query_cache = False
query_job = client.query(query, job_config = job_config)

results = query_job.result()

json_list = []

for row in results:
    json_list.append(row.my_stuff)

with open('data.json', 'w') as f:
    json.dump(json_list,f)