【问题标题】:Properly format BigQuery response正确格式化 BigQuery 响应
【发布时间】: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"
  }]

【问题讨论】:

    标签: python google-bigquery


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多