代码之家  ›  专栏  ›  技术社区  ›  Mattias

如何在python中展平google bigquery结果

  •  0
  • Mattias  · 技术社区  · 6 年前

    我有一个大型的数据库,我试图用python和bigquery api进行查询。

    但问题是它返回一个列表列表,而我在平展结果时遇到了问题。

    现在我正在做:

    client = bigquery.Client.from_service_accoun_json('...')
    query_job = client.query("""...""")
    result = query_job.result()
    

    从这里im lost,列表可以从1级到3-4级不等,这使得搜索结果非常困难。

    有没有一种有效的方法来平抑结果?

    2 回复  |  直到 6 年前
        1
  •  2
  •   dsesto    6 年前

    对于我来说,当你说你的查询报告的是一个具有不同级别的列表列表时,你的意思并不是很清楚。

    在bigquery python客户端库中, query_job 是类型的对象 google.cloud.bigquery.job.QueryJob . 为了迭代结果,只需在代码中添加一个循环,如:

    client = bigquery.Client()
    query_job = client.query("...")
    for row in query_job:
        print(row)
    

    row 对象包含从运行的bigquery查询返回的行之一。根据您使用的是标准SQL还是传统SQL, 格式将不同。标准sql是从bigquery查询数据的推荐和首选语言,但遗留sql的一个特点是 it flattens query results automatically ,因此,如果嵌套和重复字段是您的问题,则可以使用它。否则,你可以 flatten results in Standard SQL using the UNNEST operator .

    为了处理查询结果中的特定字段,您应该只处理 对象为:

    • 对于“正常”字段: row.field1
    • 对于标准SQL中的嵌套字段: row.parent[0]["child"]
    • 对于旧版SQL中的嵌套字段: row.parent_child

    无论如何,打印一个 对象,您将看到可用字段以及如何遍历它们。一般来说,可以将它们视为普通的python字典。


    另外,为了在python客户机库中使用遗留sql(它默认使用标准sql),只需要添加 QueryJobConfig 参数如下:

    client = bigquery.Client()
    job_config = bigquery.QueryJobConfig()
    job_config.use_legacy_sql = True
    query_job = client.query("...", job_config=job_config)
    
        2
  •  0
  •   yavalvas    6 年前

    在我看来,对于具有重复字段的bigquery表,最好使用bq flatten函数。 它应该比在python本身的一个重复字段上迭代更快速,看起来也更明显。 flattening of repeated type

    所以你可以做类似的事情:

    client = bigquery.Client.from_service_accoun_json('...')
    query_job = client.query('SELECT your_column from FLATTEN([dataset.tableId], repeated_column)')
    result = query_job.result()
    

    最好在bq ui中检查这样的查询,以便在执行之前获取数据量。