com.google.cloud.dataflow.sdk.transforms.windowing.Window Java Examples
The following examples show how to use
com.google.cloud.dataflow.sdk.transforms.windowing.Window.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: CountRides.java From cloud-dataflow-nyc-taxi-tycoon with Apache License 2.0 | 6 votes |
public static void main(String[] args) { CustomPipelineOptions options = PipelineOptionsFactory.fromArgs(args).withValidation().as(CustomPipelineOptions.class); Pipeline p = Pipeline.create(options); p.apply(PubsubIO.Read.named("read from PubSub") .topic(String.format("projects/%s/topics/%s", options.getSourceProject(), options.getSourceTopic())) .timestampLabel("ts") .withCoder(TableRowJsonCoder.of())) .apply("window 1s", Window.into(FixedWindows.of(Duration.standardSeconds(1)))) .apply("mark rides", MapElements.via(new MarkRides())) .apply("count similar", Count.perKey()) .apply("format rides", MapElements.via(new TransformRides())) .apply(PubsubIO.Write.named("WriteToPubsub") .topic(String.format("projects/%s/topics/%s", options.getSinkProject(), options.getSinkTopic())) .withCoder(TableRowJsonCoder.of())); p.run(); }
Example #2
Source File: UnboundedSourceITCase.java From flink-dataflow with Apache License 2.0 | 6 votes |
private static void runProgram(String resultPath) { Pipeline p = FlinkTestPipeline.createForStreaming(); PCollection<String> result = p .apply(Read.from(new RangeReadSource(1, 10))) .apply(Window.<Integer>into(new GlobalWindows()) .triggering(AfterPane.elementCountAtLeast(10)) .discardingFiredPanes()) .apply(ParDo.of(new DoFn<Integer, String>() { @Override public void processElement(ProcessContext c) throws Exception { c.output(c.element().toString()); } })); result.apply(TextIO.Write.to(resultPath)); try { p.run(); fail(); } catch(Exception e) { assertEquals("The source terminates as expected.", e.getCause().getCause().getMessage()); } }
Example #3
Source File: TimestampRides.java From cloud-dataflow-nyc-taxi-tycoon with Apache License 2.0 | 5 votes |
public static void main(String[] args) { CustomPipelineOptions options = PipelineOptionsFactory.fromArgs(args).withValidation().as(CustomPipelineOptions.class); Pipeline p = Pipeline.create(options); p.apply(PubsubIO.Read.named("read from PubSub") .topic(String.format("projects/%s/topics/%s", options.getSourceProject(), options.getSourceTopic())) .timestampLabel("ts") .withCoder(TableRowJsonCoder.of())) .apply("window 1s", Window.into(FixedWindows.of(Duration.standardSeconds(1)))) .apply("parse timestamps", MapElements.via( (TableRow e) -> Instant.from(DateTimeFormatter.ISO_DATE_TIME.parse(e.get("timestamp").toString())).toEpochMilli()) .withOutputType(TypeDescriptor.of(Long.class))) .apply("max timestamp in window", Max.longsGlobally().withoutDefaults()) .apply("transform", MapElements.via( (Long t) -> { TableRow ride = new TableRow(); ride.set("timestamp", Instant.ofEpochMilli(t).toString()); return ride; }) .withOutputType(TypeDescriptor.of(TableRow.class))) .apply(PubsubIO.Write.named("write to PubSub") .topic(String.format("projects/%s/topics/%s", options.getSinkProject(), options.getSinkTopic())) .withCoder(TableRowJsonCoder.of())); p.run(); }
Example #4
Source File: FXTimeSeriesPipelineSRGTests.java From data-timeseries-java with Apache License 2.0 | 5 votes |
public PCollection<KV<String, TSProto>> generateCompleteWindowData(Pipeline pipeline, List<KV<String, TSProto>> data, WorkPacketConfig packetConfig) { LOG.info("Check to see that time streams with missing 'ticks' have been corrected"); PCollection<KV<String, TSProto>> tsData = setupDataInput(pipeline, data); PCollection<KV<String, TSProto>> windowedData = tsData.apply("CandleResolutionWindow", Window.<KV<String, TSProto>>into(FixedWindows .of(Duration.standardSeconds(((FXTimeSeriesPipelineOptions) pipeline.getOptions()) .getCandleResolution())))); // Determine streams that are missing in this Window and generate values for them PCollection<KV<String, TSProto>> generatedValues = windowedData .apply( "DetectMissingTimeSeriesValues", Combine.globally(new DetectMissingTimeSeriesValuesCombiner(packetConfig)) .withoutDefaults()).apply(ParDo.of(new CreateMissingTimeSeriesValuesDoFn())) .setName("CreateMissingTimeSeriesValues"); // Flatten the live streams and the generated streams together PCollection<KV<String, TSProto>> completeWindowData = PCollectionList.of(windowedData).and(generatedValues) .apply("MergeGeneratedLiveValues", Flatten.<KV<String, TSProto>>pCollections()); return completeWindowData; }
Example #5
Source File: CreateAggregatesTransform.java From data-timeseries-java with Apache License 2.0 | 4 votes |
@Override public PCollection<KV<String, TSAggValueProto>> apply(PCollection<KV<String, TSProto>> input) { PCollection<KV<String, TSProto>> windowedData = input.apply("CandleResolutionWindow", Window.<KV<String, TSProto>>into( FixedWindows.of(Duration.standardSeconds(options.getCandleResolution())))); // Determine streams that are missing in this Window and generate values for them PCollection<KV<String, TSProto>> generatedValues = windowedData .apply("DetectMissingTimeSeriesValues", Combine.globally(new DetectMissingTimeSeriesValuesCombiner(packetConfig)) .withoutDefaults()) .apply(ParDo.of(new CreateMissingTimeSeriesValuesDoFn())) .setName("CreateMissingTimeSeriesValues"); // Flatten the live streams and the generated streams together PCollection<KV<String, TSProto>> completeWindowData = PCollectionList.of(windowedData).and(generatedValues).apply("MergeGeneratedLiveValues", Flatten.<KV<String, TSProto>>pCollections()); // Create partial aggregates, at this stage we will not bring forward the previous windows close // value PCollection<KV<String, TSAggValueProto>> parital = completeWindowData .apply("CreatePartialAggregates", Combine.perKey(new PartialTimeSeriesAggCombiner())); // When these aggregates go through the Global Window they will lose their time value // We will embed the window close into the data so we can access it later on PCollection<KV<String, TSAggValueProto>> paritalWithWindowBoundary = parital.apply(ParDo.of(new EmbedWindowTimeIntoAggregateDoFn())); // Create a Global window which can retain the last value held in memory We must use // outputAtEarliestInputTimestamp as later on we re-attach the timestamp from within the data // point, for us not to hit 'skew' issues we need to ensure the output timestamp value is always // the smallest value PCollection<KV<String, TSAggValueProto>> completeAggregationStage1 = paritalWithWindowBoundary.apply("completeAggregationStage1", Window.<KV<String, TSAggValueProto>>into(new GlobalWindows()) .triggering(Repeatedly.forever(AfterPane.elementCountAtLeast(1))) .withOutputTimeFn(OutputTimeFns.outputAtEarliestInputTimestamp()) .accumulatingFiredPanes()); PCollection<KV<String, TSAggValueProto>> completeAggregationStage2 = completeAggregationStage1 .apply("CreateCompleteCandles", Combine.perKey(new CompleteTimeSeriesAggCombiner())) .apply("FlattenIterables", ParDo.of(new FlattenKVIterableDoFn())); // Reset timestamps after global window PCollection<KV<String, TSAggValueProto>> completeAggregationStage3 = completeAggregationStage2.apply("ResetTimestampsAfterGlobalWindow", ParDo.of(new DoFn<KV<String, TSAggValueProto>, KV<String, TSAggValueProto>>() { @Override public void processElement( DoFn<KV<String, TSAggValueProto>, KV<String, TSAggValueProto>>.ProcessContext c) throws Exception { // // TODO When the local Dataflow runners shuts down there will be some values // produced for the end of the the GlobalWindow. We can remove these values by // filtering out anything from year 3000+ for now. Better solution will be to check // the WINDOW PANE // Instant time = c.timestamp(); if (time.isBefore(new Instant(32530703764000L))) { // The timestamp produced from the Combiner after the GlobalWindow loses fidelity, // we can add this back by looking at the value in the data if (time .isAfter(new Instant(c.element().getValue().getCloseState().getTime()))) { LOG.error( "There was a timestamp before earlier than the window and skew must be 0 :: " + TextFormat.shortDebugString(c.element().getValue())); } else { c.outputWithTimestamp(c.element(), new Instant(c.element().getValue().getCloseTime())); } } } })); return completeAggregationStage3; }
Example #6
Source File: FXTimeSeriesPipelineSRGTests.java From data-timeseries-java with Apache License 2.0 | 4 votes |
public PCollection<KV<String, TSAggValueProto>> createCompleteAggregates(Pipeline pipeline, List<KV<String, TSProto>> data, WorkPacketConfig packetConfig) { PCollection<KV<String, TSProto>> completeWindowData = generateCompleteWindowData(pipeline, data, packetConfig); PCollection<KV<String, TSAggValueProto>> parital = completeWindowData.apply("CreatePartialAggregates", Combine.perKey(new PartialTimeSeriesAggCombiner())); PCollection<KV<String, TSAggValueProto>> paritalWithWindowBoundary = parital.apply(ParDo.of(new EmbedWindowTimeIntoAggregateDoFn())); PCollection<KV<String, TSAggValueProto>> completeAggregationStage1 = paritalWithWindowBoundary.apply( "completeAggregationStage1", Window.<KV<String, TSAggValueProto>>into(new GlobalWindows()) .triggering(Repeatedly.forever(AfterPane.elementCountAtLeast(1))) .withOutputTimeFn(OutputTimeFns.outputAtEarliestInputTimestamp()) .accumulatingFiredPanes()); PCollection<KV<String, TSAggValueProto>> completeAggregationStage2 = completeAggregationStage1.apply("CreateCompleteCandles", Combine.perKey(new CompleteTimeSeriesAggCombiner())).apply("FlattenIterables", ParDo.of(new FlattenKVIterableDoFn())); PCollection<KV<String, TSAggValueProto>> completeAggregationStage3 = completeAggregationStage2.apply("ResetTimestampsAfterGlobalWindow", ParDo.of(new DoFn<KV<String, TSAggValueProto>, KV<String, TSAggValueProto>>() { @Override public void processElement( DoFn<KV<String, TSAggValueProto>, KV<String, TSAggValueProto>>.ProcessContext c) throws Exception { if (c.timestamp().isBefore(new Instant(32530703764000L))) { if (c.timestamp().isAfter( new Instant(c.element().getValue().getCloseState().getTime()))) { LOG.error("BUG There was a timestamp before current :: " + TextFormat.shortDebugString(c.element().getValue())); } else { c.outputWithTimestamp(c.element(), new Instant(c.element().getValue() .getCloseTime())); } } } })); return completeAggregationStage3; }