Google cloud dataflow 确定PCollection的大小

Google cloud dataflow 确定PCollection的大小,google-cloud-dataflow,Google Cloud Dataflow,我正在写一个数据流作业,它将从GCS和BigQuery读取数据。 此作业将合并从两个源读取的数据。合并数据只是字符串 然后,此作业将合并数据发布到外部api。编写自定义接收器以发布合并数据 如果合并数据超过1 GB,则外部API将不允许发布数据 如果整合的数据超过1 GB,我只想使数据流作业失败。如何获取PCollection中的数据大小 目前,我正在使用以下代码确定尺寸 private static class CalculateSize extends PTransform<P

我正在写一个数据流作业,它将从GCS和BigQuery读取数据。 此作业将合并从两个源读取的数据。合并数据只是字符串

然后,此作业将合并数据发布到外部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()));
    }

}
私有静态类CalculateSize扩展了ptTransform{
私有静态最终长serialVersionUID=-73838717124713335638L;
@凌驾
公共PCollection应用(PCollection输入){
返回输入
.apply(ParDo.named(“IndividualSize”).of(新DoFn(){
@凌驾
public void processElement(ProcessContext c)引发异常{
c、 输出(Integer.valueOf(c.element().length()).longValue());
}
}))
.apply(Combine.globally(new Sum.SumLongFn());
}
}

有没有其他更好的方法来确定尺寸?

您发布的代码就是正确的方法。确定数据以预期格式写入接收器时所占用的大致数据量完全是特定于接收器的,数据流无法为您做到这一点。因此,编写一个函数来手动计算是最好的方法

注意,您需要考虑不同的开销来源。例如,如果你的接收器是一个CSV文件,那么简单地将各个记录字段的长度相加,你就会低估该文件将占用的字节数。您需要考虑逗号、空格、换行符、引号、多字节字符等。这种开销也是完全特定于格式的


但是,如果只需要确保不超过1GB,您可以稍微悲观地放大近似值。

谢谢您的输入。我只是想确保它不超过1GB。我不想要确切的尺寸。因此,考虑到额外的字符、多字节字符等,我认为有一个悲观的值对我来说就足够了。