【问题标题】:Get TableSchema from BigQuery result PCollection<TableRow>从 BigQuery 结果 PCollection<TableRow> 获取 TableSchema
【发布时间】:2016-04-03 19:04:22
【问题描述】:

当我在 BigQuery Web UI 中运行查询时,结果会显示在一个表中,其中每个字段的名称和类型都是已知的(即使字段是 COUNT()、AVG()、...操作,字段类型当然是已知的)。 然后可以将结果直接导出为 table/json/csv。

我的问题是,当我在我的 java 项目中检索查询结果时,例如有一个查询:

String query =  "SELECT nationality, COUNT(DISTINCT personID) AS population 
                 FROM Dataset.Table 
                 GROUP BY nationality";

PCollection<TableRow> result = p.apply(BigQueryIO.Read.fromQuery(query));

...是否可以在不显式定义的情况下获得resultPCollection 中的TableRow 架构? 我认为这一定是可能的,因为在使用 BigQuery Web UI 时可以使用相同的查询。 但我不知道该怎么做......

TableSchema schema =  // function of PCollection<TableRow> result ?

result.apply(BigQueryIO.Write
                .named("Write Results Table")
                .to(getTableReference(tableName))
                .withSchema(schema));

这样查询结果总是可以自动导出/保存到新表中(然后只需要显式提供表名)。

有什么想法吗?任何帮助将不胜感激:)

【问题讨论】:

    标签: java google-bigquery google-cloud-dataflow


    【解决方案1】:

    很遗憾,Dataflow SDK 没有公开 BigQuery 通过 Dataflow 的 BigQueryIO API 返回的架构。仅在 Dataflow API 中没有“好的”解决方法。

    手动定义架构是一种解决方法。

    或者,您可以在管道构建时直接通过 jobs: query 对 BigQuery 进行单独查询,然后可以将其结果传递给 BigQueryIO.Write 转换。这可能会产生额外的成本,但可以通过稍微改变查询以减少处理的数据量来减轻这种成本。输出的正确性无关紧要,因为您只存储架构。

    【讨论】:

    • 确实如此;使用你提到的作业:查询确实返回了一个模式,但不能证明额外的成本是合理的。可以通过将 'LIMIT n' 合并到查询中来限制处理的数据量,但只有在没有使用聚合函数(例如 COUNT()、AVG() 等)时才会降低成本——这通常是这种情况,很遗憾。可能有一些笨拙的解决方法 - 仅将原始表的第一行复制到新表中(以便它们具有相同的字段),然后仅查询新表以获得架构。 ??
    • 查询确定架构的成本应该很少或没有。您只需在查询中设置dryRun 标志,然后就不会处理任何字节。
    • @DanHalperin 的答案应该被标记为正确!
    【解决方案2】:

    从概念上讲 - 您应该编写一个函数,该函数将遍历给定 TableRow 的所有单元格,并为每个单元格获取名称和类型,并且在迭代时您将创建相应的 TableSchema。
    对于简单的模式,我希望它应该相对容易。
    对于带有记录、重复等的模式,这可能会更复杂

    【讨论】:

    • TableRow 由 JSON 支持。 JSON 类型的表现力不如 BigQuery 类型。虽然可以在 JSON 中区分字符串和数字,但在 BigQuery 中可能无法确定它源自哪种数字类型(例如整数、长整数)。此外,如果某些值为null,您将无法说出它的原始类型。因此,推断的 BigQuery 架构可能与原始架构不匹配,即使对于简单架构也是如此。
    • 谢谢 Davor,有道理
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多