【发布时间】:2016-02-24 16:30:56
【问题描述】:
我们正在使用 BigQuery 检索大表的全部内容。我们使用的是公开的 publicdata:samples.natality。
我们的代码遵循他们的API doc - java 中描述的 Google 说明。
我们能够以大约 1'300 行/秒 的速度检索此表,这非常慢。是否有更快的方法来检索查询的完整结果,或者这总是尽可能快速?
【问题讨论】:
标签: java google-bigquery
我们正在使用 BigQuery 检索大表的全部内容。我们使用的是公开的 publicdata:samples.natality。
我们的代码遵循他们的API doc - java 中描述的 Google 说明。
我们能够以大约 1'300 行/秒 的速度检索此表,这非常慢。是否有更快的方法来检索查询的完整结果,或者这总是尽可能快速?
【问题讨论】:
标签: java google-bigquery
从 BigQuery 表中检索大量数据的推荐方法是不要使用 tabledata.list 来翻阅该示例所使用的完整表。该示例针对读取查询结果的少量行进行了优化。
相反,您应该运行一个提取作业,将表的全部内容导出到 Google Cloud Storage,然后您可以从中下载全部内容。
https://cloud.google.com/bigquery/exporting-data-from-bigquery
【讨论】:
要快速下载表格,您可以使用 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();
}
参考资料:
【讨论】: