代码之家  ›  专栏  ›  技术社区  ›  LaurensVijnck

梁:使用窗口边界写入每个窗口元素计数

  •  0
  • LaurensVijnck  · 技术社区  · 7 年前

    对于一个简单的概念证明,我尝试在两分钟的窗口中单击窗口数据。我只想从那里打印每个窗口的计数,以及窗口的边界到BigQuery。在运行管道时,我不断收到以下错误:

    org.apache.beam.sdk.Pipeline$PipelineExecutionException: java.lang.RuntimeException: java.io.IOException: Insert failed: [{"errors":[{"debugInfo":"","location":"windowend","message":"This field is not a record.","reason":"invalid"}],"index":0}]
    

    管道如下所示:

    // Creating the pipeline
    Pipeline p = Pipeline.create(options);
    
    // Window items
    PCollection<TableRow> counts = p.apply("ReadFromPubSub", PubsubIO.readStrings().fromTopic(options.getTopic()))
    .apply("AddEventTimestamps", WithTimestamps.of(TotalCountPipeline::ExtractTimeStamp).withAllowedTimestampSkew(Duration.standardDays(10000)))
            .apply("Window", Window.<String>into(
                    FixedWindows.of(Duration.standardHours(options.getWindowSize())))
                    .triggering(
                            AfterWatermark.pastEndOfWindow()
                                    .withLateFirings(AfterPane.elementCountAtLeast(1)))
                    .withAllowedLateness(Duration.standardDays(10000))
                    .accumulatingFiredPanes())
            .apply("CalculateSum", Combine.globally(Count.<String>combineFn()).withoutDefaults())
            .apply("BigQueryFormat", ParDo.of(new FormatCountsFn()));
    
    // Writing to BigQuery
    counts.apply("WriteToBigQuery",BigQueryIO.writeTableRows()
                    .to(options.getOutputTable())
                    .withSchema(getSchema())
    .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND));
    
    // Execute pipeline
    p.run().waitUntilFinish();
    

    static class FormatCountsFn extends DoFn<Long, TableRow> {
        @ProcessElement
        public void processElement(ProcessContext c, BoundedWindow window) {
            TableRow row =
                    new TableRow()
                            .set("windowStart", window.maxTimestamp().toDateTime())
                            .set("count", c.element().intValue());
            c.output(row);
        }
    }
    

    灵感来自 this post

    1 回复  |  直到 7 年前
        1
  •  2
  •   LaurensVijnck    7 年前

    显然,这个问题的答案与光束窗口无关,只与BigQuery有关。将DateTime对象写入BigQuery行需要使用正确的yyyy-MM-dd HH:MM:ss格式的字符串,这与我提供的DateTime对象不同。

    推荐文章