【问题标题】:Best way to read BigQuery Table阅读 BigQuery 表的最佳方式
【发布时间】:2019-01-15 11:11:39
【问题描述】:

从 BigQuery 读取和过滤数据,我有两种方式

  1. 从 Dataflow 中的 BigQuery 读取(使用 BigqueryIO.readTableRow.from(ValueProvider))整个数据,然后根据 max Date 等条件进行过滤

  2. 使用 NestedValueProvider 从 Dataflow 中的 BigQuery 中读取数据会慢得多。

因为如果我读取整个数据并且我的表处于附加模式会出现问题,这将增加读取数据的时间作为一天的通行证。

但如果我只读取特定日期数据,这将使我的管道读取时间一致。

但是对于 200 条记录,嵌套值提供程序比使用 BigqueryIO.readTableRow.from(ValueProvider) 读取整个数据所花费的时间要多得多。

我错过了什么有人可以帮忙吗?

我的代码片段在下面请查找。

Snippet:

PCollection<TableRow> targetTable = input.apply("Read TRUSTED_LAYER_TABLE_DESCRIPTION", BigQueryIO
                    .readTableRows()
                    .withoutValidation()
                    .withTemplateCompatibility()
                    .fromQuery(NestedValueProvider.of(options.get(Constants.TABLE_DESCRIPTION.toString())
                            , new QueryTranslator(options.get(Constants.ETL_BATCH_ID.toString())))).usingStandardSql());

嵌套值提供程序类片段:

public class QueryTranslator implements SerializableFunction{

    /**
     * Read data with max etlbatchid from query
     */

    ValueProvider<String> etlbatchid;
    public QueryTranslator(ValueProvider<String> etlbatchid){
        this.etlbatchid = etlbatchid;
    }

    private static final long serialVersionUID = -2754362391392873056L;

    @Override
    public String apply(String input) {
        String batchId = this.etlbatchid.get();
        if(batchId.equals("-1"))
            return String.format("SELECT * from `%s`", input);
        else
            return String.format("SELECT * from `%s` where etlbatchid = %s;", input,batchId);
    }
}

【问题讨论】:

  • 不确定你在问什么。你能试着澄清一下吗?
  • @GrahamPolley 我再次更新了可能对您有帮助的问题。

标签: google-cloud-platform google-bigquery google-cloud-dataflow apache-beam


【解决方案1】:

根据您的用例,这两种方式都可以使用,您应该考虑每种方式的优缺点。

第一个(读取整个表)将非常快,因为 Dataflow 可以轻松地将工作负载拆分为多个分片并以并行方式处理它,因此速度很快。不利的一面是,由于 CPU 使用密集,成本可能会更高。

由于 BigQuery 将执行多项操作,第二个选项预计会较慢,但成本效益高。此选项的缺点可能是,您可能会遇到一个或多个quota and limit of BigQuery,这将需要精心编码才能推翻。

您还可以检查是否可以为reading the whole tableuse a string queryuse a filter method 实现这些示例(灵感来自StackOverflow thread)。

【讨论】:

    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 2010-09-13
    • 2021-07-19
    • 1970-01-01
    相关资源
    最近更新 更多