如何(流式)将许多小行(每行几个字节)经济高效地插入到 BigQuery 中?
How to (streaming-) insert many small rows (few bytes per row) into BigQuery cost-efficiently?
我有一个具有以下属性的 BigQuery table:
Table size: 1.64 TB
Number of rows: 9,883,491,153
使用流式插入将数据放在那里(每批 500 行)。
从 Google Cloud Pricing Calculator 来看,到目前为止这些插入物的成本应该大约为 86 美元。
但实际上是482$左右。
解释在pricing docs:
Streaming inserts (tabledata.insertAll
): [=12=].010 per 200 MB (You are charged for rows that are successfully inserted. Individual rows are calculated using a 1 KB minimum size.)
因此,对于我的 table,每行只有 182 字节,但我需要为每行支付完整的 1024 字节,导致最初(错误)估计的 ~ 562%成本。
是否有规范的(当然也是合法的)方法来改善这种情况,即降低成本? (类似于插入到只有一个结构数组列的临时 table,以连续保存多行,然后定期拆分移动到实际目标 table?)
我可以向您推荐这些选项:
使用 BigQuery 存储写入 API。您可以将记录流式传输到 BigQuery 中,它们可以作为写入数据库中的记录使用,或者批处理一个过程以插入大量记录以在单个操作中提交。
一些优点是:
- 成本更低,因为您每月有 2 TB 的免费空间。
- 它通过使用流偏移支持恰好一次语义。
- 如果 table 架构在客户端流式传输时发生变化,BigQuery
存储写入通知客户端。
这里是关于 BigQuery Storage Write 的更多信息。
另一种选择,您可以使用 Beam/DataFlow 创建一个用于流式传输到 BigQuery 的批处理,并使用 BigQueryIO 和批处理的写入方法。
可以查看更多信息here.
我有一个具有以下属性的 BigQuery table:
Table size: 1.64 TB
Number of rows: 9,883,491,153
使用流式插入将数据放在那里(每批 500 行)。
从 Google Cloud Pricing Calculator 来看,到目前为止这些插入物的成本应该大约为 86 美元。
但实际上是482$左右。
解释在pricing docs:
Streaming inserts (
tabledata.insertAll
): [=12=].010 per 200 MB (You are charged for rows that are successfully inserted. Individual rows are calculated using a 1 KB minimum size.)
因此,对于我的 table,每行只有 182 字节,但我需要为每行支付完整的 1024 字节,导致最初(错误)估计的 ~ 562%成本。
是否有规范的(当然也是合法的)方法来改善这种情况,即降低成本? (类似于插入到只有一个结构数组列的临时 table,以连续保存多行,然后定期拆分移动到实际目标 table?)
我可以向您推荐这些选项:
使用 BigQuery 存储写入 API。您可以将记录流式传输到 BigQuery 中,它们可以作为写入数据库中的记录使用,或者批处理一个过程以插入大量记录以在单个操作中提交。
一些优点是:
- 成本更低,因为您每月有 2 TB 的免费空间。
- 它通过使用流偏移支持恰好一次语义。
- 如果 table 架构在客户端流式传输时发生变化,BigQuery 存储写入通知客户端。
这里是关于 BigQuery Storage Write 的更多信息。
另一种选择,您可以使用 Beam/DataFlow 创建一个用于流式传输到 BigQuery 的批处理,并使用 BigQueryIO 和批处理的写入方法。 可以查看更多信息here.