我正在尝试在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进行部分提取,但我认为可能有更好的解决方案..)
感谢您的帮助
答案 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中执行此操作。