private String paneInfoToString(PaneInfo paneInfo) { String paneString = String.format("pane-%d", paneInfo.getIndex()); if (paneInfo.getTiming() == Timing.LATE) { paneString = String.format("%s-late", paneString); } if (paneInfo.isLast()) { paneString = String.format("%s-last", paneString); } return paneString; }
@Override public Iterable<T> apply(Iterable<ValueInSingleWindow<T>> input) { List<T> outputs = new ArrayList<>(); for (ValueInSingleWindow<T> value : input) { if (value.getPane().isLast()) { outputs.add(value.getValue()); } } return outputs; } }
res.append(iw.start().toString()).append("-").append(iw.end().toString()); boolean isOnlyFiring = pane.isFirst() && pane.isLast(); if (!isOnlyFiring) { if (res.length() > 0) {
@ProcessElement public void processElement(@Element Attribution attribution, @Timestamp Instant timestamp, BoundedWindow window, PaneInfo pane, OutputReceiver<String> output) { StringBuilder builder = new StringBuilder(String.format( "%s: %s %s %-7s", Utils.formatWindow(window), attribution, Utils.formatTime(timestamp), pane.getTiming())); if (pane.getTiming() != PaneInfo.Timing.UNKNOWN) { builder.append(String.format(" index=%d", pane.getIndex())); if (pane.getNonSpeculativeIndex() > -1) builder.append(" onTimeIndex=" + pane.getNonSpeculativeIndex()); if (pane.isFirst()) builder.append(" isFirst"); if (pane.isLast()) builder.append(" isLast"); } output.output(builder.toString()); } }
@Override public Iterable<T> apply(Iterable<ValueInSingleWindow<T>> input) { List<T> outputs = new ArrayList<>(); for (ValueInSingleWindow<T> value : input) { if (!value.getPane().isFirst() || !value.getPane().isLast()) { throw site.wrap( String.format( "Expected elements to be produced by a trigger that fires at most once, but got " + "a value %s in a pane that is %s.", value, value.getPane().isFirst() ? "not the last pane" : "not the first pane")); } outputs.add(value.getValue()); } return outputs; } }
@ProcessElement public void processElement(@Element KV<String, Integer> kv, @Timestamp Instant timestamp, BoundedWindow window, PaneInfo pane, OutputReceiver<String> output) { StringBuilder builder = new StringBuilder(String.format( "%s: %s:%-2d %s %-7s index=%d", Utils.formatWindow(window), kv.getKey(), kv.getValue(), Utils.formatTime(timestamp), pane.getTiming(), pane.getIndex())); if (pane.getNonSpeculativeIndex() > -1) builder.append(" onTimeIndex=" + pane.getNonSpeculativeIndex()); if (pane.isFirst()) builder.append(" isFirst"); if (pane.isLast()) builder.append(" isLast"); output.output(builder.toString()); } }
@ProcessElement public void processElement(ProcessContext c) { if (c.pane().isLast()) { c.output(c.element()); } } }
@ProcessElement public void processElement(ProcessContext c) { c.output(c.element() + ": " + c.pane().isLast()); } }
@ProcessElement public void processElement(ProcessContext c, BoundedWindow window) throws Exception { String[] values = c.element().getValue().split(",", -1); TableRow row = new TableRow() .set("trigger_type", triggerType) .set("freeway", c.element().getKey()) .set("total_flow", Integer.parseInt(values[0])) .set("number_of_records", Long.parseLong(values[1])) .set("window", window.toString()) .set("isFirst", c.pane().isFirst()) .set("isLast", c.pane().isLast()) .set("timing", c.pane().getTiming().toString()) .set("event_time", c.timestamp().toString()) .set("processing_time", Instant.now().toString()); c.output(row); } }
@Override public ResourceId windowedFilename( int shardNumber, int numShards, BoundedWindow window, PaneInfo paneInfo, OutputFileHints outputFileHints) { String filenamePrefix = outputFilePrefix.isDirectory() ? "" : firstNonNull(outputFilePrefix.getFilename(), ""); IntervalWindow interval = (IntervalWindow) window; String windowStr = String.format("%s-%s", interval.start().toString(), interval.end().toString()); String filename = String.format( "%s-%s-%s-of-%s-pane-%s%s%s.avro", filenamePrefix, windowStr, shardNumber, numShards, paneInfo.getIndex(), paneInfo.isLast() ? "-last" : "", outputFileHints.getSuggestedFilenameSuffix()); return outputFilePrefix.getCurrentDirectory().resolve(filename, RESOLVE_FILE); }
break; checkState(!previousPane.isLast(), "Last pane was not last after all.");