首页 > 解决方案 > Google Bigquery 客户端库中的 put 方法是否使用流式插入?

问题描述

我想知道下面的代码是否会导致每个值都发生流式插入src(假设传递了一个结构切片src)?

func (u *Inserter) Put(ctx context.Context, src interface{}) (err error) {
    ctx = trace.StartSpan(ctx, "cloud.google.com/go/bigquery.Inserter.Put")
    defer func() { trace.EndSpan(ctx, err) }()

    savers, err := valueSavers(src)
    if err != nil {
        return err
    }
    return u.putMulti(ctx, savers)
}

Put方法可以处理多个对象或单个对象,但如果这确实是该方法的输出的计费方式,我想避免为每个插入付费。

标签: google-bigquery

解决方案


是的,Put 使用 StreamingInsert。如果您查看putMulti的定义,您会看到它正在调用 Tabledata.InsertAll,这是为流式调用调用的方法

请注意,流式传输按插入的行收费,而不是按请求收费。因此,例如,每个“Put”写入 5 行而不是仅写入 1 行是相同的。

如果您的用例允许,您应该考虑使用加载作业加载数据,这是批量加载的免费操作。


推荐阅读