正确格式化 BigQuery 响应
Posted
技术标签:
【中文标题】正确格式化 BigQuery 响应【英文标题】:Properly format BigQuery response 【发布时间】:2016-07-02 11:56:07 【问题描述】:从 BigQuery 项目中查询数据:
def post(self):
lat = self.request.get("lat")
lng = self.request.get("lng")
query = '''query'''
query_data =
'query': (query)
logging.info(query)
query_request = service.jobs()
query_response = query_request.query(projectId=PROJECTID, body=query_data).execute()
这些行返回类似于以下内容的内容:
"rows": ["f": ["v": "area name.", "v": "example", "v": " 100233", "v": "0.0000", "v": "0.0000", "v": "761", "v": "street name", "v": "50", "v": "City", "v": "25", "v": "Town", "v": "distance value"]
有没有办法可以将其格式化为这种性质的东西?
[
"streetName": "street name",
"streetId": "16833",
"data": "example",
"latitude": "0.0000",
"longitude": "0.0000",
"areaId": "847",
"areaName": "area name",
"townId": "50",
"townName": "town",
"stateId": "25",
"stateName": "City",
"distance": "distance value"
]
【问题讨论】:
【参考方案1】:您是否使用通用 API 客户端而不是特定于云的客户端? (后者是指通过运行pip install google-cloud
安装的那个)。后者提供了一个QueryResults
class,它为您预先解析了行。
query = client.run_sync_query(SQL_CODE)
query.run()
# insert some job.reload/job.state busy waiting
print(query.rows)
无论如何,我认为推荐使用 Cloud Python 客户端。也就是说,由于最初的问题似乎是指通用 API 客户端,因此除了 rows
之外,您还需要在 query
对象上使用 schema
字段。
schema
将用作您在遍历 rows
对象时进行比较的地图。
我在具有深度嵌套/重复字段的架构上使用了以下内容;但是,对于不是 REPEATED 的 REPEATED 字段(例如 REPEATED STRING 等)上发生的情况,我没有任何示例。将此类行为视为未定义。
def merge_schema_to_rows(rows, schema):
acc =
if isinstance(rows, list):
return list(map(lambda x: merge_schema_to_rows(x, schema), rows))
if rows is None:
return None
# If a field is a REPEATED RECORD, each entry in that field's f list will only
# have a v.
if 'f' not in rows:
rows = rows['v']
for i, field in enumerate(rows['f']):
if schema['fields'][i]['type'] == 'RECORD':
acc[schema['fields'][i]['name']] = merge_schema_to_rows(field['v'], schema['fields'][i])
else:
acc[schema['fields'][i]['name']] = field['v']
return acc
编辑:在 GitHub 上一探究竟,我找到了 a more canonical solution(即 Google Cloud 客户端所做的事情,这是我上面提供的解决方案的一个更强大但更长的版本。)
【讨论】:
以上是关于正确格式化 BigQuery 响应的主要内容,如果未能解决你的问题,请参考以下文章
BigQuery json 函数 - 如果 json 字符串格式不正确,则无法提取所有值
BigQuery:验证所有日期的格式为 yyyy-mm-dd