【问题标题】:How to improve BigQuery read performance如何提高 BigQuery 读取性能
【发布时间】:2016-02-24 16:30:56
【问题描述】:

我们正在使用 BigQuery 检索大表的全部内容。我们使用的是公开的 publicdata:samples.natality。

我们的代码遵循他们的API doc - java 中描述的 Google 说明。

我们能够以大约 1'300 行/秒 的速度检索此表,这非常慢。是否有更快的方法来检索查询的完整结果,或者这总是尽可能快速

【问题讨论】:

    标签: java google-bigquery


    【解决方案1】:

    从 BigQuery 表中检索大量数据的推荐方法是不要使用 tabledata.list 来翻阅该示例所使用的完整表。该示例针对读取查询结果的少量行进行了优化。

    相反,您应该运行一个提取作业,将表的全部内容导出到 Google Cloud Storage,然后您可以从中下载全部内容。

    https://cloud.google.com/bigquery/exporting-data-from-bigquery

    【讨论】:

    • 酷,谢谢。是否可以使用语句(不仅是表)进行导出,您对“Google Cloud Dataflow”性能有一些经验吗?
    • 您只能导出表,因此如果要导出查询结果,您需要执行两步过程:运行查询,然后导出查询的目标表。如果您不想自己链接它,Dataflow 将是运行该过程的一个不错的选择。我没有太多使用 Dataflow 的个人经验,不妨试试 google-cloud-dataflow 标签?
    【解决方案2】:

    要快速下载表格,您可以使用 Google BigQuery Storage Client for Java。

    它允许您将表格下载为高效的二进制格式,例如 Avro 或 Arrow。 使用文档中的基本箭头示例,我设法每秒下载约 100 万行。

    我认为您可以通过将结果写入临时表来使用它来下载查询结果。

    获取结果临时表的代码如下:

    public static TableId getTemporaryTable(String query) throws InterruptedException{
        QueryJobConfiguration queryConfig = 
                    QueryJobConfiguration.newBuilder(query)
                        .setUseLegacySql(false)
                        .build();
        Job queryJob = bigquery.create(JobInfo.newBuilder(queryConfig).build());
        queryJob = queryJob.waitFor(); // Wait for the query to complete.
        return ((QueryJobConfiguration) queryJob.getConfiguration()).getDestinationTable();
    }
    

    参考资料:

    【讨论】:

      猜你喜欢
      • 2011-09-26
      • 2019-04-05
      • 2012-04-10
      • 2021-10-11
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 2021-08-03
      相关资源
      最近更新 更多