BigQuery - 插入数据的问题

Posted

技术标签:

【中文标题】BigQuery - 插入数据的问题【英文标题】:BigQuery - Issues inserting data 【发布时间】: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 显示网页界面的流缓冲区中是否有数据。 【参考方案1】:

如果您多次运行insertId,您的insertId 就不是唯一的,并且您稍后会得到具有相同insertId 的行--> 从缓冲区中清除之前的行。这也具有滚雪球效应,您在流缓冲区中不断有数据,并且永远不会结束存储,因为它正在被具有相同 insertIds 的新请求清除。

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

【讨论】:

我将添加有关如何生成 ID 的信息。 我明白了,错了,它已经在你的代码中了:$arrayToInsert[$i]['insertId'] = $currentSize + 1 + $i; 这不是原子的,它只是一个序列号。 所以你的意思是如果我对 insertId 使用microtime() 方法,我所有的问题都会得到解决...? 如果你过于频繁地运行它,你需要的不仅仅是 microtime(),因为相同的 microtime() 在不同的并行执行中可能具有相同的值,并且从这些行中只会考虑一个。 没有帮助。

以上是关于BigQuery - 插入数据的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 nodejs 的 bigquery 插入方法插入地理类型数据

使用 Golang 将嵌套数据插入 BigQuery

将数据插入 Bigquery 表的最佳方法

通过 bigquery-python 库向 BigQuery 插入大量数据

BigQuery 加载作业不会插入所有数据

BigQuery 流式插入使用模板表数据可用性问题