从BigQuery结果PCollection <tablerow>获取TableSchema

时间:2015-12-29 20:44:14

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

当我在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));

...是否可以在result PCollection中获取TableRow的模式,而无需明确定义它? 我认为它必须是可能的,因为在使用BigQuery Web UI时,它可以使用相同的查询。 但我无法弄清楚如何做到这一点......

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

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

这样查询结果可以随时自动导出/保存到新表中(只需要明确提供表名)。

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

2 个答案:

答案 0 :(得分:3)

不幸的是,Dataflow SDK不会通过Dataflow的BigQueryIO API公开BigQuery返回的架构。仅Dataflow API中没有“好的”解决方法。

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

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

答案 1 :(得分:1)

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