当我在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));
这样查询结果可以随时自动导出/保存到新表中(只需要明确提供表名)。
有什么想法吗?任何帮助将不胜感激:)
答案 0 :(得分:3)
不幸的是,Dataflow SDK不会通过Dataflow的BigQueryIO
API公开BigQuery返回的架构。仅Dataflow API中没有“好的”解决方法。
手动定义架构是一种解决方法。
或者,您可以在管道构建时通过jobs: query
直接对BigQuery进行单独查询,然后可以将其结果传递给BigQueryIO.Write
转换。这可能会产生额外的成本,但这可以通过稍微改变查询来减少处理的数据量来减轻。输出的正确性是不相关的,因为您只存储模式。
答案 1 :(得分:1)
从概念上讲 - 你应该编写一个函数,它将遍历给定TableRow的所有单元格并为每个单元格获取名称和类型,迭代时你将创建相应的TableSchema。
对于简单的模式,我认为,它应该相对容易
对于具有记录,重复等的模式,这可能更复杂