我正在编写一个数据流作业,它将从GCS和BigQuery读取数据。 此作业将合并从两个来源读取的数据。合并数据只是String。
然后,此作业将合并数据发布到外部api中。编写自定义接收器以发布合并数据。
如果合并数据超过1 GB,外部API将不允许发布数据。
如果合并数据超过1 GB,我只想让数据流作业失败。如何获得PCollection中存在的数据大小?
目前我正在使用以下代码确定尺寸
private static class CalculateSize extends PTransform<PCollection<String>, PCollection<Long>> {
private static final long serialVersionUID = -7383871712471335638L;
@Override
public PCollection<Long> apply(PCollection<String> input) {
return input
.apply(ParDo.named("IndividualSize").of(new DoFn<String, Long>() {
@Override
public void processElement(ProcessContext c) throws Exception {
c.output(Integer.valueOf(c.element().length()).longValue());
}
}))
.apply(Combine.globally(new Sum.SumLongFn()));
}
}
还有其他更好的方法来查找尺寸吗?
答案 0 :(得分:0)
您发布的代码是执行此操作的正确方法。确定以预期格式写入接收器时数据占用的大约数量完全是特定于接收器的,Dataflow无法为您执行此操作。因此,编写一个函数来手动计算它是最好的方法。
请注意,您需要考虑不同的开销来源。例如。如果您的接收器是一个CSV文件,那么只需添加各个记录字段的长度就会低估该文件占用的字节数。您需要考虑逗号,空格,换行符,引号,多字节字符等。此开销也完全取决于格式。
但是,如果确保不超过1GB是非常重要的,那么您可以稍微悲观地扩大近似值。