我的场景是这里讨论的一个变体: How do I write to BigQuery using a schema computed during Dataflow execution?
在这种情况下,目标是相同的(在执行期间读取模式,然后将具有该模式的表写入BigQuery),但我想在单个管道中完成它。
例如,我想将一个CSV文件写入BigQuery并避免两次获取文件(一次读取模式,一次读取数据)。
这可能吗?如果是这样,最好的方法是什么?
我目前最好的猜测是通过侧输出将模式读入PCollection,然后在将数据传递给BigQueryIO.Write之前使用它创建表(使用自定义PTransform)。
答案 0 :(得分:2)
如果使用BigQuery.Write创建表,则在创建表时需要知道模式。
您提议的在创建BigQuery.Write转换时未指定架构的解决方案可能有效,但您可能会收到错误,因为该表不存在且您没有配置BigQueryIO.Write如果需要,可以创建它。
您可能需要考虑在主程序中读取足够多的CSV文件,以便在运行管道之前确定架构。这将避免在运行时确定模式的复杂性。你仍会承担额外阅读的费用,但希望这是最小的。
或者你创建一个custom sink 将数据写入BigQuery。您的Sinks可以将数据写入GCS。然后,您的finalize方法可以创建BigQuery load job。您的自定义接收器可以通过查看记录来推断架构,并使用适当的架构创建BigQuery表。