static void Main(string[] args) { var env = StreamExecutionEnvironment.GetExecutionEnvironment() .SetStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime) .EnableCheckpointing(60 * 1000, CheckpointingMode.ExactlyOnce); env.CheckpointConfig.CheckpointTimeout = 30 * 1000; var partitionCount = 2; var orderExtTopicName = "orders"; // 1. 读取kafka创建源数据 var sourceStream = env.AddSource <string>(null) .SetParallelism(partitionCount) .SetName("source_kafka_" + orderExtTopicName) .SetUId("source_kafka_" + orderExtTopicName); // 2. 创建SubOrderDetail数据流 var orderStream = sourceStream.Map(new SubOrderDetailMapper()) .SetName("map_sub_order_detail") .SetUId("map_sub_order_detail"); // 3. 统计每天的数据,每秒持续输出。 var siteDayWindowStream = orderStream .KeyBy("siteId") .Window(TumblingProcessingTimeWindowAssigner <SubOrderDetail> .Of(TimeSpan.FromDays(1), TimeSpan.FromHours(-8))) .Trigger(ContinuousProcessingTimeTrigger <SubOrderDetail, TimeWindow> .Of(TimeSpan.FromSeconds(1))); // 5. 计算站点聚合指标 var siteAggStream = siteDayWindowStream .Aggregate(new OrderAndGmvAggregateFunc()) .SetName("aggregate_site_order_gmv") .SetUId("aggregate_site_order_gmv"); // 6. 只输出变化的聚合指标 var siteResultStream = siteAggStream .KeyBy(0) .Process(new OutputOrderGmvProcessFunc(), TypeInformation.Of <(long, string)>()) .SetName("process_site_gmv_changed") .SetUId("process_site_gmv_changed"); // todo: // 6. Sink到Redis,利用有序集合完成TopN排序。 // 显示端直接从Redis中查询结果。 Console.WriteLine("Hello World!"); }
/// <summary> /// Windows this <see cref="DataStream{TElement}"/> into sliding time windows. /// Note: This operation is inherently non-parallel since all elements have to pass through the same operator instance. /// </summary> /// <param name="size">The size of the window.</param> /// <returns></returns> public AllWindowedStream <TElement, TimeWindow> TimeWindowAll(TimeSpan size) => ExecutionEnvironment.StreamTimeCharacteristic == TimeCharacteristic.ProcessingTime ? WindowAll(TumblingProcessingTimeWindowAssigner <TElement> .Of(size)) : WindowAll(TumblingEventTimeWindowAssigner <TElement> .Of(size));