正确格式化 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

BigQuery:验证所有日期的格式为 yyyy-mm-dd

从 Avro 将 unix 时间戳(以秒为单位)导入 Bigquery 中的正确时间戳

AFNetworking 响应格式不正确

Torrent Tracker 响应似乎格式不正确