【发布时间】:2016-01-03 02:34:53
【问题描述】:
我已经玩了一段时间的数据流/大查询,但我仍然无法理解一些基本的东西,即何时使用某种类型的方法查询一个表。
BigQueryIO.Read 的单行查询选项是:
+ 简短,
+ 适用于大型结果,在 PCollection 中返回,
- 但不为结果返回新的表模式,
使其更难同时导出到 (1) .csv 文件 - 表头,
领域!!和 (2) bigquery 表 - 没有模式!
每次要将查询结果保存到 bigquery 表或 .csv 文件时,我们都需要手动定义表模式或字段-csv 头。
---> 有没有一种自动的方式可以优雅地完成?
查询的另一个选项是使用Jobs : Query。
这又有优点也有缺点:
+ 返回查询结果的表模式
- 需要身份验证,最后对于精确的简单查询有更多的编码
-> 异步和同步模式;
- 不适合大型结果,
除了在带有选项allowLargeResults 的异步模式下,这会在后台产生多个查询,需要组合这些查询以获得检索到的行的完整列表 (??)
- 结果可以保存到表中,但只有异步查询可以将结果保存在永久表中(不仅仅是临时表)。
问题仍然存在:
(1) 哪种方法更好,什么时候更好?
(2)
如果我们查询的表中有非常大量的数据并且我们得到非常大的结果,那么首选哪种查询方法?
(3) 处理非常大的结果(表格或 .csv 文件)时,首选哪种导出方式?
【问题讨论】:
-
灵感来自我之前的问题stackoverflow.com/questions/34518795/…
-
我正在尝试回答这个问题,但不清楚您真正想要什么。您问的是一些非常底层的问题——您能否描述一下您正在尝试执行的实际端到端数据处理?
-
请注意,如果您只想保存查询结果,您可能应该只使用 BigQuery 的异步 API 来运行查询,然后将 CSV 导出到 GCS。
-
关于“异步与同步”查询模式:在 BigQuery 中没有真正同步的方式来运行查询。如果你仔细阅读,jobs.query 需要在下载数据之前轮询等待作业完成,就像 job.insert 一样。出于您的问题的目的,我会坚持使用 jobs.insert。
标签: java csv google-bigquery google-cloud-dataflow google-cloud-bigtable