Google Big Query + PHP - >如何在不耗尽内存的情况下获取大型数据集

时间:2014-03-19 12:05:54

标签: php sql memory google-bigquery large-data

我正在尝试在BigQuery / PHP(使用google php SDK)中运行一个返回大型数据集的查询(可以是100,000 - 10,000,000行)。

$bigqueryService = new Google_BigqueryService($client);

$query = new Google_QueryRequest();
$query->setQuery(...);

$jobs = $bigqueryService->jobs;
$response = $jobs->query($project_id, $query); 
//query is a syncronous function that returns a full dataset

下一步是允许用户将结果下载为CSV文件。

当数据集变得太大(内存限制)时,上面的代码将失败。 我有什么选择以较低的内存使用率执行此操作?

(我认为一个选项是使用BigQuery将结果保存到另一个表,然后开始使用LIMIT和OFFSET进行部分提取,但我认为可能有更好的解决方案..)

感谢您的帮助

3 个答案:

答案 0 :(得分:4)

您可以直接从Bigquery

导出数据

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

您可以使用PHP运行导出的API调用(您不需要BQ工具)

您需要设置作业configuration.extract.destinationFormat,请参阅reference

答案 1 :(得分:2)

只是详细说明Pentium10的答案

您可以以json格式导出最多1GB的文件。 然后,您可以逐行读取文件,这将最大限度地减少应用程序使用的内存,然后您可以使用json_decode信息。

答案 2 :(得分:1)

出口的建议很好,我只是想提到另一种方式。

您正在调用的查询API(jobs.query())未返回完整数据集;它只返回一页数据,这是结果的前2 MB。您可以设置maxResults标记(描述为here)以将其限制为特定行数。

如果您返回的行数少于表格中的行数,则响应中会出现pageToken字段。然后,您可以通过提供作业ID(也在查询响应中)和页面标记来使用jobs.getQueryResults() API获取余数。这将继续返回新行和新页面标记,直到您到达表的末尾。

示例here显示了运行查询并逐页获取结果的代码(在python中的java中)。

API中还有一个选项可以通过在URL查询字符串中指定alt='csv'直接转换为CSV,但我不确定如何在PHP中执行此操作。