如何遍历BigQuery查询结果并将其写入文件

时间:2019-05-14 09:57:24

标签: google-bigquery python-3.7

我需要查询Google BigQuery表并将结果导出到gzip压缩文件中。 这是我当前的代码。要求是每行数据应使用新行(\ n)代替。

def batch_job_handler(args):

    credentials = Credentials.from_service_account_info(service_account_info)

    client = Client(project=service_account_info.get("project_id"),
                    credentials=credentials)

    query_job = client.query(QUERY_STRING)

    results = query_job.result()  # Result's total_rows is 1300000 records

    with gzip.open("data/query_result.json.gz", "wb") as file:
        data = ""
        for res in results:
            data += json.dumps(dict(list(res.items()))) + "\n"
            break
        file.write(bytes(data, encoding="utf-8"))

上面的解决方案对少量结果非常适用,但是如果结果有1300000条记录,则速度太慢。

是因为以下这一行:json.dumps(dict(list(res.items()))) + "\n"是因为我正在通过用新行将每个记录串联来构造一个巨大的字符串。

当我以AWS批处理方式运行该程序时,它消耗了太多时间。我需要有关迭代结果并以更快的方式写入数百万条记录的文件的帮助。

2 个答案:

答案 0 :(得分:0)

(在大多数情况下)您应该将BigQuery查询的输出指向临时表,然后将该临时表导出到Google Cloud Storage Bucket。您可以从该存储桶中本地下载内容。这是在本地获得结果的最快方法。所有其他一切都将非常缓慢,尤其是要反复进行结果,因为BQ不是为此而设计的。

答案 1 :(得分:0)

查看新的BigQuery Storage API以快速阅读:

有关正在使用的API的示例,请参见以下项目:

  

与使用以前的基于导出的读取流相比,它具有许多优点,这些优点通常可以带来更好的读取性能:

     
      
  • 直接流式传输
  •   
     

它不会在Google Cloud Storage中保留任何临时文件。使用Avro连线格式直接从BigQuery服务器读取行。

     
      
  • 过滤
  •   
     

新的API允许列过滤和有限谓词过滤仅读取您感兴趣的数据。

     
      
  • 列过滤
  •   
     

由于BigQuery由列式数据存储支持,因此它可以有效地流式传输数据,而无需读取所有列。

     
      
  • 谓词过滤
  •   
     

Storage API支持有限的谓词过滤器下推。它支持与文字

的单个比较