我使用数据流/ bigquery已经有一段时间了,但是我仍然无法理解一些基本的事情,即什么时候使用某种类型的方法来查询表。
使用BigQueryIO.Read的单行查询选项是:
查询的另一个选项是使用作业:查询。
这又有其优点和缺点:
allowLargeResults的异步模式下,这会导致背景中的多个查询,需要组合这些查询才能获得检索到的行的完整列表(?)问题仍然存在:
(1)哪种方法更好,什么时候更好?
(2)如果我们查询的表中有大量的数据,并且得到了非常大的结果,那么首选哪种查询方法?
(3)在处理非常大的结果(表还是.csv文件)时,哪个导出是首选的?
发布于 2016-01-04 18:54:59
请注意,BigQueryIO.Read读取表,而不执行查询。helper .fromQuery()允许源执行一个查询,然后读取将查询结果写入的目标表。将查询执行与表读取分离可能很有用。
我们可以将BigQueryIO.Read看作是运行jobs.insert()到Google的导出操作,然后处理来自GCS的数据。
查看https://cloud.google.com/bigquery/exporting-data-from-bigquery#exportingmultiple上的“多个通配符Uris”,以便高效地并行处理导出到GCS的数据:您可以在导出数据时使用(小的)导出数据碎片,因此不必阻止并行读取操作的处理以完成整个BigQuery导出作业。多个通配符允许您预先确定工作人员的并行性,BigQuery将按顺序编写数据,以便每个工作人员能够独立地处理他们的碎片,并识别他们的数据子集何时被完全处理过。
云数据流支持自定义源(https://cloud.google.com/dataflow/model/custom-io#creating-sources),因此您可以使用一个版本复制BigQueryIO.Read,该版本为您正在操作的表的模式提供了一个侧通道。
(*)我不是云数据流专家,所以我不知道如何构建这个侧通道。也许从这个自定义源导出的模式是表的模式和blob,您可以将该源包装为一个ParDo,它接受该模式并将blob转换为该模式?此时,您的代码将看到每一行的架构和数据。这似乎不是解决问题的最有效的方法,但它可能对你有用。
https://stackoverflow.com/questions/34572777
复制相似问题