【发布时间】:2017-05-03 11:51:55
【问题描述】:
我目前正在为 BigQuery 使用 new Google PHP libraries,它运行得非常好,但是我在性能方面遇到了一些问题,我找不到任何相关信息。
我正在使用新的 insertRows 方法将数据发送到 BigQuery,虽然我总是收到响应“bigquery#tableDataInsertAllResponse”,但我几乎没有真正看到我的数据被插入。
通常我一次发送的这些数据集大约有 30-100 个项目,我查找了 BigQuery 的配额,我没有超过它,甚至没有接近限制。
BigQuery 确实输入了我最终发送的一些行,但 BigQuery 需要很长时间才能确认我发送了数据,并且当它确认我发送数据时,它会在流式缓冲区中保存好几天,最终只插入一些数据.
这是我用来插入数据的函数:
public function insertInto($tableName, $datasetName, $arrayToInsert) {
if (empty($arrayToInsert)) {
return true;
}
$table = $this->getTable($tableName, $datasetName);
$bqTable = $this->bigQueryIdController->getBigQueryTable($tableName, $datasetName);
$arraySize = count($arrayToInsert);
$currentSize = $bqTable->getSize();
for ($i = 0; $i < $arraySize; ++$i) {
$arrayToInsert[$i]['insertId'] = $currentSize + 1 + $i;
}
$insertResponse = $table->insertRows($arrayToInsert);
if (!$insertResponse->isSuccessful()) {
$this->handleFailedRows($insertResponse->failedRows());
return false;
} else {
$this->bigQueryIdController->updateBigQueryTable($bqTable, $arraySize);
return true;
}
}
有什么办法可以加快速度吗?我现在不能真正使用 BigQuery,因为我的数据需要多长时间才能真正可用。
编辑:
我已经发现重复 ID 条目上的行可以被忽略,但是这不会发生。每当我尝试插入表时,它都会在本地而不是远程获取表的大小,而是在我的数据库中存储一个值。如果它不存在,它将远程获取大小并将其存储在本地。每当插入成功时,它会将“插入”项目的数量添加到计数中并更新本地大小。我的数据库中的值是应该存在多少项目。
【问题讨论】:
-
您所说的“BigQuery 需要很长时间才能确认我发送了数据”是什么意思?您如何确定数据是否可用?
-
BigQuery 显示网页界面的流缓冲区中是否有数据。
标签: php google-bigquery