正确格式化BigQuery响应

时间:2016-07-02 11:56:08

标签: python google-bigquery

从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 个答案:

答案 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客户端所做的工作,这是我上面提供的解决方案的一个更强大但更长的版本。)