从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"
}]
答案 0 :(得分:0)
您使用的是通用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客户端,因此除了schema
之外,您还需要使用query
对象上的rows
字段。
schema
将作为您在遍历rows
对象时进行比较的地图。
我在具有深度嵌套/重复字段的模式中使用了以下内容;但是,我没有任何样本,因为REPEATED字段不是RECORD(例如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客户端所做的工作,这是我上面提供的解决方案的一个更强大但更长的版本。)