BigQuery - 插入数据的问题

时间:2017-05-03 11:51:55

标签: php google-bigquery

我目前正在使用适用于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条目上解除行,但是,这不会发生。每当我尝试插入表时,它将在本地获取表的大小,而不是远程,而是在我的数据库中存储的值。如果它不存在,它将远程获取大小并将其存储在本地。每当插入成功时,它会添加&#34;插入&#34;计数的项目并更新本地大小。我的数据库中的值是应该存在多少项。

1 个答案:

答案 0 :(得分:0)

如果您多次运行,则insertId不是唯一的,而您最后会使用具有相同insertId的行 - >&gt;擦除缓冲区中的前一行。这也有一个滚雪球效应,你不断在流缓冲区中有数据,并且永远不会结束存储,因为它被一个具有相同insertIds的新请求所消灭。

确保insertId是原子或微时间。 insertId对于每个请求应该是非常不同的。在极少数情况下,您希望从同一行的5个位置进行流式传输,并且只允许1行,这就是当您需要insertId来保持通用时仅保留1中的1(这是一个示例)