目前使用Dataflow从BigQuery读入表数据并使用一定数量的分片写入Cloud Storage。
//Read Main Input
PCollection<TableRow> input = pipeline.apply("ReadTableInput",
BigQueryIO.readTableRows().from("dataset.table"));
// process and write files
input.apply("ProcessRows", ParDo.of(new Process())
.apply("WriteToFile", TextIO.write()
.to(outputFile)
.withHeader(HEADER)
.withSuffix(".csv")
.withNumShards(numShards));
为了管理文件大小,我们估计了将文件保持在特定大小下所需的分片总数。
有没有办法代替设置分片数量,设置文件大小并让分片是动态的?
从设计上来说,这是不可能的。如果你深入研究Beam的核心,你可以通过编程方式定义一个执行图,然后运行它。这个过程是大规模并行的(ParDo
的意思是“并行执行”),在同一个节点上或几个节点/VM上。
这里的分片数只是并行工作以写入文件的“写入器”的数量。然后PCollection将被拆分为所有工作人员写入。
大小是非常可变的(例如消息的大小、文本编码、压缩与否和压缩因子,…),Beam不能依赖它来构建它的图形。