如何提高 BigQuery 读取性能

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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();

参考资料:

Google cloud documentation GitHub repository

【讨论】:

以上是关于如何提高 BigQuery 读取性能的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中提高数据流插入 Bigquery 表的性能

使用 Apache Beam 向 BigQuery 传播插入时如何指定 insertId

通过 Spark 使用 BigQuery Storage API:请求多个分区但仅获得 1 个

提高 BigQuery 不区分大小写的搜索性能

如何在 Google BigQuery 的记录中查询字符串?文档不工作

Google Cloud Dataproc 删除 BigQuery 表不起作用