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 插入方法插入地理类型数据