国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

二次開發(fā)Flink-coGroup算子支持遲到數(shù)據(jù)通過(guò)測(cè)輸出流提取

這篇具有很好參考價(jià)值的文章主要介紹了二次開發(fā)Flink-coGroup算子支持遲到數(shù)據(jù)通過(guò)測(cè)輸出流提取。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

1.背景

2.coGroup算子源碼分析

2.1完整的coGroup算子調(diào)用流程

2.2coGroup方法入口

2.3?CoGroupedStreams對(duì)象分析

2.4WithWindow內(nèi)部類分析

2.5CoGroupWindowFunction函數(shù)分析

3.修改源碼支持獲取遲到數(shù)據(jù)測(cè)輸出流

3.1復(fù)制CoGroupedStreams

3.2新增WithWindow.sideOutputLateData方法

3.3新增WithWindow構(gòu)造方法

3.4修改apply方法

3.5開放UnionTypeInfo類的public權(quán)限

?3.6編譯Flink源碼flink-streaming-java模塊

3.7項(xiàng)目中查看maven是否已經(jīng)刷新為最新代碼

4.測(cè)試


1.背景

coGroup算子開窗到時(shí)間關(guān)閉之后,遲到數(shù)據(jù)無(wú)法通過(guò)測(cè)輸出流提取,intervalJoin算子提供了api,因?yàn)閖oin算子底層就是coGroup算子,所以Join算子也不行。

flink版本 v1.17.1

2.coGroup算子源碼分析

2.1完整的coGroup算子調(diào)用流程

    input1.coGroup(input2)
    .where(keySelector1)
    .equalTo(keySelector2)
    .window(windowAssigner)
    .trigger(trigger)
    .evictor(evictor)
    .allowedLateness(allowedLateness)
    .apply(cgroupFunction)

通過(guò)上述代碼可以看到?jīng)]有sideOutputLateData的相關(guān)方法,用來(lái)提取窗口關(guān)閉之后的遲到數(shù)據(jù)

2.2coGroup方法入口

其中創(chuàng)建了一個(gè)CoGroupedStreams流對(duì)象

    /**
     * Creates a join operation. See {@link CoGroupedStreams} for an example of how the keys and
     * window can be specified.
     */
    public <T2> CoGroupedStreams<T, T2> coGroup(DataStream<T2> otherStream) {
        return new CoGroupedStreams<>(this, otherStream);
    }

2.3?CoGroupedStreams對(duì)象分析

他可以理解為構(gòu)造設(shè)計(jì)模式的一個(gè)Builder類,通過(guò)where方法配置第一條流的KeySelector,再返回一個(gè)CoGroupedStreams的內(nèi)部類Where,再通過(guò)equalTo方法配置第二條流的KeySelector,再返回EqualTo內(nèi)部類,window方法配置窗口劃分器,返回WithWindow內(nèi)部類,后續(xù)都是窗口的配置?trigger,evictor,allowedLateness配置窗口參數(shù),最后調(diào)用apply方法傳送用戶業(yè)務(wù)函數(shù)

2.4WithWindow內(nèi)部類分析

WithWindow是最終保存所有配置的內(nèi)部類包括兩條流,窗口配置,key提取器的配置,最終會(huì)用戶調(diào)用apply方法觸發(fā)CoGroup的業(yè)務(wù),在apply方法中通過(guò)union聯(lián)合兩條流,然后通過(guò)keyby轉(zhuǎn)為KeyedStream,再通過(guò)window配置窗口,最終調(diào)用窗口函數(shù)的apply方法,傳入WindowFunction,做CoGroup的業(yè)務(wù)與用戶業(yè)務(wù)。

具體代碼如下已寫好備注


    /**
     * A co-group operation that has {@link KeySelector KeySelectors} defined for both inputs as
     * well as a {@link WindowAssigner}.
     *
     * @param <T1> Type of the elements from the first input
     * @param <T2> Type of the elements from the second input
     * @param <KEY> Type of the key. This must be the same for both inputs
     * @param <W> Type of {@link Window} on which the co-group operation works.
     */
    @Public
    public static class WithWindow<T1, T2, KEY, W extends Window> {
        //第一條流
        private final DataStream<T1> input1;
        //第二條流
        private final DataStream<T2> input2;
        //第一個(gè)key提取器
        private final KeySelector<T1, KEY> keySelector1;
        //第二個(gè)Key提取器
        private final KeySelector<T2, KEY> keySelector2;
        //Key的類型
        private final TypeInformation<KEY> keyType;
        //窗口分配器
        private final WindowAssigner<? super TaggedUnion<T1, T2>, W> windowAssigner;
        //窗口出發(fā)計(jì)算器
        private final Trigger<? super TaggedUnion<T1, T2>, ? super W> trigger;

        private final Evictor<? super TaggedUnion<T1, T2>, ? super W> evictor;

        private final Time allowedLateness;

        private WindowedStream<TaggedUnion<T1, T2>, KEY, W> windowedStream;
        //構(gòu)造函數(shù)給上面對(duì)象賦值
        protected WithWindow(
                DataStream<T1> input1,
                DataStream<T2> input2,
                KeySelector<T1, KEY> keySelector1,
                KeySelector<T2, KEY> keySelector2,
                TypeInformation<KEY> keyType,
                WindowAssigner<? super TaggedUnion<T1, T2>, W> windowAssigner,
                Trigger<? super TaggedUnion<T1, T2>, ? super W> trigger,
                Evictor<? super TaggedUnion<T1, T2>, ? super W> evictor,
                Time allowedLateness) {
            this.input1 = input1;
            this.input2 = input2;

            this.keySelector1 = keySelector1;
            this.keySelector2 = keySelector2;
            this.keyType = keyType;

            this.windowAssigner = windowAssigner;
            this.trigger = trigger;
            this.evictor = evictor;

            this.allowedLateness = allowedLateness;
        }

        /**
         * Completes the co-group operation with the user function that is executed for windowed
         * groups.
         *
         * <p>Note: This method's return type does not support setting an operator-specific
         * parallelism. Due to binary backwards compatibility, this cannot be altered. Use the
         * {@link #with(CoGroupFunction, TypeInformation)} method to set an operator-specific
         * parallelism.
         */
        public <T> DataStream<T> apply(
                CoGroupFunction<T1, T2, T> function, TypeInformation<T> resultType) {
            // clean the closure
            function = input1.getExecutionEnvironment().clean(function);
			//創(chuàng)建合并兩個(gè)流的公共TypeInfo,UnionTypeInfo最終會(huì)將Input1,Input2的數(shù)據(jù)通過(guò)map算子轉(zhuǎn)換為該類型
            UnionTypeInfo<T1, T2> unionType =
                    new UnionTypeInfo<>(input1.getType(), input2.getType());
			//轉(zhuǎn)換成union的KeySelector
            UnionKeySelector<T1, T2, KEY> unionKeySelector =
                    new UnionKeySelector<>(keySelector1, keySelector2);
			//將taggedInput1的數(shù)據(jù)類容map成UnionTypeInfo<T1, T2>類型
            SingleOutputStreamOperator<TaggedUnion<T1, T2>> taggedInput1 =
                    input1.map(new Input1Tagger<T1, T2>());
            taggedInput1.getTransformation().setParallelism(input1.getParallelism(), false);
            taggedInput1.returns(unionType);
	       //將taggedInput2的數(shù)據(jù)類容map成UnionTypeInfo<T1, T2>類型
            SingleOutputStreamOperator<TaggedUnion<T1, T2>> taggedInput2 =
                    input2.map(new Input2Tagger<T1, T2>());
            taggedInput2.getTransformation().setParallelism(input2.getParallelism(), false);
            taggedInput2.returns(unionType);
			//將兩個(gè)流進(jìn)行union
            DataStream<TaggedUnion<T1, T2>> unionStream = taggedInput1.union(taggedInput2);
			//keyBy并且開窗
            windowedStream =
                    new KeyedStream<TaggedUnion<T1, T2>, KEY>(
                                    unionStream, unionKeySelector, keyType)
                            .window(windowAssigner);
			//配置窗口觸發(fā)器
            if (trigger != null) {
                windowedStream.trigger(trigger);
            }
			//配置移除器
            if (evictor != null) {
                windowedStream.evictor(evictor);
            }
			//配置allowedLateness
            if (allowedLateness != null) {
                windowedStream.allowedLateness(allowedLateness);
            }
			//創(chuàng)建CoGroupWindowFunction ,并把用戶函數(shù)傳入進(jìn)去
            return windowedStream.apply(
                    new CoGroupWindowFunction<T1, T2, T, KEY, W>(function), resultType);
        }

        /**
         * Completes the co-group operation with the user function that is executed for windowed
         * groups.
         *
         * <p><b>Note:</b> This is a temporary workaround while the {@link #apply(CoGroupFunction,
         * TypeInformation)} method has the wrong return type and hence does not allow one to set an
         * operator-specific parallelism
         *
         * @deprecated This method will be removed once the {@link #apply(CoGroupFunction,
         *     TypeInformation)} method is fixed in the next major version of Flink (2.0).
         */
        @PublicEvolving
        @Deprecated
        public <T> SingleOutputStreamOperator<T> with(
                CoGroupFunction<T1, T2, T> function, TypeInformation<T> resultType) {
            return (SingleOutputStreamOperator<T>) apply(function, resultType);
        }
		
        @VisibleForTesting
        Time getAllowedLateness() {
            return allowedLateness;
        }
		//獲取窗口包裝流,但是標(biāo)記為VisibleForTesting,用戶無(wú)法調(diào)用,如果可以調(diào)用的話可以通過(guò)該方法獲取包裝流之后通過(guò)窗口流獲取遲到數(shù)據(jù)的測(cè)輸出流
        @VisibleForTesting
        WindowedStream<TaggedUnion<T1, T2>, KEY, W> getWindowedStream() {
            return windowedStream;
        }
    }

2.5CoGroupWindowFunction函數(shù)分析

CoGroupWindowFunction也是CoGroupedStreams內(nèi)部類,負(fù)責(zé)做CoGroup的業(yè)務(wù),最終將數(shù)據(jù)封裝好轉(zhuǎn)發(fā)給用戶函數(shù)(也就是2.1中apply中的cgroupFunction)

   private static class CoGroupWindowFunction<T1, T2, T, KEY, W extends Window>
            extends WrappingFunction<CoGroupFunction<T1, T2, T>>
            implements WindowFunction<TaggedUnion<T1, T2>, T, KEY, W> {

        private static final long serialVersionUID = 1L;

        public CoGroupWindowFunction(CoGroupFunction<T1, T2, T> userFunction) {
            super(userFunction);
        }

        @Override
        public void apply(KEY key, W window, Iterable<TaggedUnion<T1, T2>> values, Collector<T> out)
                throws Exception {
			//緩存當(dāng)前窗口里1號(hào)流的數(shù)據(jù)
            List<T1> oneValues = new ArrayList<>();
			//緩存當(dāng)前窗口里2號(hào)流的數(shù)據(jù)
            List<T2> twoValues = new ArrayList<>();

            for (TaggedUnion<T1, T2> val : values) {
                if (val.isOne()) {
                    oneValues.add(val.getOne());
                } else {
                    twoValues.add(val.getTwo());
                }
            }
			//傳入到用戶函數(shù)中
            wrappedFunction.coGroup(oneValues, twoValues, out);
        }
    }

3.修改源碼支持獲取遲到數(shù)據(jù)測(cè)輸出流

思路 復(fù)制CoGroupedStreams新增一個(gè)NewCoGroupedStreams,在WithWindow函數(shù)中增加方法sideOutputLateData,讓用戶傳入outputTag,用于提取窗口關(guān)閉后的測(cè)輸出流。

3.1復(fù)制CoGroupedStreams

二次開發(fā)Flink-coGroup算子支持遲到數(shù)據(jù)通過(guò)測(cè)輸出流提取,# 從0到1閱讀Flink源碼,flink,大數(shù)據(jù)

3.2新增WithWindow.sideOutputLateData方法

新增該方法,傳入outputTag,下圖WithWindow構(gòu)造方法是3.3新增的

    @PublicEvolving
        public WithWindow<T1, T2, KEY, W> sideOutputLateData(
                OutputTag<TaggedUnion<T1, T2>> outputTag) {
            return new WithWindow<>(
                    input1,
                    input2,
                    keySelector1,
                    keySelector2,
                    keyType,
                    windowAssigner,
                    trigger,
                    evictor,
                    allowedLateness,
                    outputTag
            );
        }

3.3新增WithWindow構(gòu)造方法

新增屬性laterDataOutputTag,用來(lái)保存構(gòu)造函數(shù)中傳入的laterOutputTag

   protected WithWindow(
                DataStream<T1> input1,
                DataStream<T2> input2,
                KeySelector<T1, KEY> keySelector1,
                KeySelector<T2, KEY> keySelector2,
                TypeInformation<KEY> keyType,
                WindowAssigner<? super TaggedUnion<T1, T2>, W> windowAssigner,
                Trigger<? super TaggedUnion<T1, T2>, ? super W> trigger,
                Evictor<? super TaggedUnion<T1, T2>, ? super W> evictor,
                Time allowedLateness,
                OutputTag<TaggedUnion<T1, T2>> laterOutputTag
        ) {
            this(
                    input1,
                    input2,
                    keySelector1,
                    keySelector2,
                    keyType,
                    windowAssigner,
                    trigger,
                    evictor,
                    allowedLateness);
            this.lateDataOutputTag = laterOutputTag;

        }

3.4修改apply方法

判斷l(xiāng)ateDataOutputTag 是否為null,如果不為null則調(diào)用windowedStream的sideOutputLateData設(shè)置遲到數(shù)據(jù)tag

 /**
         * Completes the co-group operation with the user function that is executed for windowed
         * groups.
         *
         * <p>Note: This method's return type does not support setting an operator-specific
         * parallelism. Due to binary backwards compatibility, this cannot be altered. Use the
         * {@link #with(CoGroupFunction, TypeInformation)} method to set an operator-specific
         * parallelism.
         */
        public <T> DataStream<T> apply(
                CoGroupFunction<T1, T2, T> function, TypeInformation<T> resultType) {
            // clean the closure
            function = input1.getExecutionEnvironment().clean(function);

            UnionTypeInfo<T1, T2> unionType =
                    new UnionTypeInfo<>(input1.getType(), input2.getType());
            UnionKeySelector<T1, T2, KEY> unionKeySelector =
                    new UnionKeySelector<>(keySelector1, keySelector2);

            SingleOutputStreamOperator<TaggedUnion<T1, T2>> taggedInput1 =
                    input1.map(new Input1Tagger<T1, T2>());
            taggedInput1.getTransformation().setParallelism(input1.getParallelism(), false);
            taggedInput1.returns(unionType);

            SingleOutputStreamOperator<TaggedUnion<T1, T2>> taggedInput2 =
                    input2.map(new Input2Tagger<T1, T2>());
            taggedInput2.getTransformation().setParallelism(input2.getParallelism(), false);
            taggedInput2.returns(unionType);

            DataStream<TaggedUnion<T1, T2>> unionStream = taggedInput1.union(taggedInput2);

            // we explicitly create the keyed stream to manually pass the key type information in
            windowedStream =
                    new KeyedStream<TaggedUnion<T1, T2>, KEY>(
                            unionStream, unionKeySelector, keyType)
                            .window(windowAssigner);
            if (trigger != null) {
                windowedStream.trigger(trigger);
            }
            if (evictor != null) {
                windowedStream.evictor(evictor);
            }
            if (allowedLateness != null) {
                windowedStream.allowedLateness(allowedLateness);
            }
            //判斷l(xiāng)ateDataOutputTag是否為NULL,如果不為NULL,則調(diào)用windowedStream
            //的sideOutputLateData方法,傳入lateDataOutputTag讓遲到數(shù)據(jù)輸出到測(cè)輸出流中
            if (lateDataOutputTag != null) {
                windowedStream.sideOutputLateData(lateDataOutputTag);
            }
            return windowedStream.apply(
                    new CoGroupWindowFunction<T1, T2, T, KEY, W>(function), resultType);
        }

3.5開放UnionTypeInfo類的public權(quán)限

該類就是union之后的公共類的類型 oneType代表Input1流的數(shù)據(jù)類型,TwoType代表Input2流的數(shù)據(jù)類型

3.6編譯Flink源碼flink-streaming-java模塊

進(jìn)入到flink-streaming-java所在磁盤目錄輸入以下命令編譯

mvn clean install -DskipTests -Dfast

二次開發(fā)Flink-coGroup算子支持遲到數(shù)據(jù)通過(guò)測(cè)輸出流提取,# 從0到1閱讀Flink源碼,flink,大數(shù)據(jù)

編譯成功

3.7項(xiàng)目中查看maven是否已經(jīng)刷新為最新代碼

編譯之后,可以看到導(dǎo)入的maven包已經(jīng)有了新增的NewCoGroupedStreams類了,注意項(xiàng)目中的maven依賴中的flink版本,要與編譯源碼的版本一致,否則無(wú)法引入到。

二次開發(fā)Flink-coGroup算子支持遲到數(shù)據(jù)通過(guò)測(cè)輸出流提取,# 從0到1閱讀Flink源碼,flink,大數(shù)據(jù)

4.測(cè)試

新建兩個(gè)流,通過(guò)new?NewCoGroupedStreams創(chuàng)建對(duì)象,在allowedLateness之后通過(guò)sideOutputLateData設(shè)置outputTag,然后通過(guò)with方法觸發(fā)業(yè)務(wù),with底層也是調(diào)用了apply,只不過(guò)他幫我們把返回的流轉(zhuǎn)為了SingleOutputStreamOperator類型,可以用于提取測(cè)輸出流。最后通過(guò)with.getSideOutput(outputTag)提取測(cè)輸出流,最后通過(guò)map轉(zhuǎn)換為?Tuple2<Integer, WaterSensor> 類型進(jìn)行打印

    OutputTag<NewCoGroupedStreams.TaggedUnion<WaterSensor, WaterSensor>> outputTag = new OutputTag<>("later",
                new NewCoGroupedStreams.UnionTypeInfo<>(Types.POJO(WaterSensor.class), Types.POJO(WaterSensor.class)));
        
        NewCoGroupedStreams<WaterSensor, WaterSensor> newCgroupStream = new NewCoGroupedStreams<>(ds1, ds2);
        
        SingleOutputStreamOperator<String> with = newCgroupStream.where((x) -> x.getId()).equalTo(x -> x.getId()).window(TumblingEventTimeWindows.of(Time.seconds(10)))
                .allowedLateness(Time.seconds(3))
                .sideOutputLateData(outputTag)
                .with(new RichCoGroupFunction<WaterSensor, WaterSensor, String>() {
                    @Override
                    public void coGroup(Iterable<WaterSensor> first, Iterable<WaterSensor> second, Collector<String> out) throws Exception {
                        out.collect(first.toString() + "======" + second.toString());
                    }
                });
        with.print();
        with.getSideOutput(outputTag).map(new MapFunction<NewCoGroupedStreams.TaggedUnion<WaterSensor, WaterSensor>, Tuple2<Integer, WaterSensor>>() {
            @Override
            public Tuple2<Integer, WaterSensor> map(NewCoGroupedStreams.TaggedUnion<WaterSensor, WaterSensor> value) throws Exception {
                return value.isOne() ? Tuple2.of(1, value.getOne()) : Tuple2.of(2, value.getTwo());
            }
        }).print();

可以看到下圖結(jié)果,ts代表時(shí)間戳,第一個(gè)打印是RichCoGroupFunction打印,代表關(guān)閉了1~10s的時(shí)間窗,后面我們?cè)谳斎?WaterSensor{id='a', ts=1, vc=1} 就通過(guò)測(cè)輸出流打印為二元組了

二次開發(fā)Flink-coGroup算子支持遲到數(shù)據(jù)通過(guò)測(cè)輸出流提取,# 從0到1閱讀Flink源碼,flink,大數(shù)據(jù)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-847153.html

到了這里,關(guān)于二次開發(fā)Flink-coGroup算子支持遲到數(shù)據(jù)通過(guò)測(cè)輸出流提取的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【API篇】十一、Flink水位線傳遞與遲到數(shù)據(jù)處理

    【API篇】十一、Flink水位線傳遞與遲到數(shù)據(jù)處理

    上游task處理完水位線,時(shí)鐘改變后,要把數(shù)據(jù)和當(dāng)前水位線繼續(xù)往下游算子的task發(fā)送。當(dāng)一個(gè)任務(wù)接收到多個(gè)上游并行任務(wù)傳遞來(lái)的水位線時(shí),以 最小的那個(gè)作為當(dāng)前任務(wù)的事件時(shí)鐘 。如圖:上游算子并行度為4,: 總結(jié): 接收到上游多個(gè),取最小 往下游多個(gè)發(fā)送,廣播

    2024年02月08日
    瀏覽(22)
  • 二次開發(fā)DataX以支持HIVE分區(qū)表

    二次開發(fā)DataX以支持HIVE分區(qū)表

    ????????最近在一個(gè)大數(shù)據(jù)的項(xiàng)目開發(fā)中使用到了數(shù)據(jù)同步工具DataX,但在使用過(guò)程中發(fā)現(xiàn)了DataX對(duì)HIve分區(qū)表的支持不太友好。 ????????具體體現(xiàn)在將數(shù)據(jù)庫(kù)中的數(shù)據(jù)同步到HIVE分區(qū)表時(shí),寫入目錄為HIVE表分區(qū)為dt=XXXX,如果不提前創(chuàng)建該分區(qū),會(huì)報(bào)目錄不存在的錯(cuò)誤,如

    2024年02月16日
    瀏覽(27)
  • [開源]一個(gè)低代碼引擎,支持在線實(shí)時(shí)構(gòu)建低碼平臺(tái),支持二次開發(fā)

    [開源]一個(gè)低代碼引擎,支持在線實(shí)時(shí)構(gòu)建低碼平臺(tái),支持二次開發(fā)

    TinyEngine低代碼引擎使能開發(fā)者定制低代碼平臺(tái),支持在線實(shí)時(shí)構(gòu)建低碼平臺(tái),支持二次開發(fā)或集成低碼平臺(tái)能力。 使用MIT開源協(xié)議 TinyEngine是一個(gè)低代碼引擎,基于這個(gè)引擎可以構(gòu)建或者開發(fā)出不同領(lǐng)域的低代碼平臺(tái)。 跨端跨框架前端組件 支持在線實(shí)時(shí)構(gòu)建、支持二次開發(fā)

    2024年02月07日
    瀏覽(24)
  • Debian二次開發(fā)網(wǎng)關(guān)支持Docker+RS485+網(wǎng)口

    Debian二次開發(fā)網(wǎng)關(guān)支持Docker+RS485+網(wǎng)口

    隨著物聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,瑞芯微邊緣計(jì)算網(wǎng)關(guān)作為一種集成多種接口和功能的智能網(wǎng)關(guān),逐漸成為了物聯(lián)網(wǎng)領(lǐng)域中的熱門產(chǎn)品。本文將詳細(xì)介紹瑞芯微邊緣計(jì)算網(wǎng)關(guān)的特點(diǎn)和優(yōu)勢(shì),并探討其在實(shí)際應(yīng)用中的廣泛應(yīng)用。 瑞芯微Linux系統(tǒng)邊緣計(jì)算網(wǎng)關(guān)是一種具有高性能、低功

    2024年02月11日
    瀏覽(17)
  • calcite在flink中的二次開發(fā),介紹解析器與優(yōu)化器

    calcite在flink中的二次開發(fā),介紹解析器與優(yōu)化器

    關(guān)于calcite的概念相關(guān)的內(nèi)容,在我另一篇帖子 深入理解flinksql執(zhí)行流程,擴(kuò)展解析器實(shí)現(xiàn)語(yǔ)法的擴(kuò)展 首先闡述一下 codegen: Codegen是基于ObjectWeb ASM的低開銷的java代碼生成器,他可以根據(jù)預(yù)先填好的規(guī)則與條件,通過(guò)編譯代碼,自動(dòng)生成java類 在遞歸調(diào)用各個(gè)節(jié)點(diǎn) DataStreamRel 的

    2024年02月22日
    瀏覽(129)
  • Java+springboot+avue醫(yī)院績(jī)效考核系統(tǒng)源碼支持二次開發(fā)

    Java+springboot+avue醫(yī)院績(jī)效考核系統(tǒng)源碼支持二次開發(fā)

    公立醫(yī)院改革要求建立公立醫(yī)療衛(wèi)生機(jī)構(gòu)績(jī)效考核體系,借助績(jī)效考核來(lái)引導(dǎo)各級(jí)公立醫(yī)院把社會(huì)效益擺在首位,提高醫(yī)療服務(wù)質(zhì)量,規(guī)范醫(yī)療服務(wù)行為,加強(qiáng)醫(yī)院內(nèi)部管理,促進(jìn)醫(yī)院高質(zhì)量發(fā)展 醫(yī)院績(jī)效考核系統(tǒng),建立以醫(yī)院發(fā)展目標(biāo)為導(dǎo)向,以醫(yī)務(wù)人員勞動(dòng)價(jià)值、工作量

    2024年02月05日
    瀏覽(20)
  • 高性能、可擴(kuò)展、支持二次開發(fā)的企業(yè)電子招標(biāo)采購(gòu)系統(tǒng)源碼

    高性能、可擴(kuò)展、支持二次開發(fā)的企業(yè)電子招標(biāo)采購(gòu)系統(tǒng)源碼

    在數(shù)字化時(shí)代,企業(yè)需要借助先進(jìn)的數(shù)字化技術(shù)來(lái)提高工程管理效率和質(zhì)量。招投標(biāo)管理系統(tǒng)作為企業(yè)內(nèi)部業(yè)務(wù)項(xiàng)目管理的重要應(yīng)用平臺(tái),涵蓋了門戶管理、立項(xiàng)管理、采購(gòu)項(xiàng)目管理、采購(gòu)公告管理、考核管理、報(bào)表管理、評(píng)審管理、企業(yè)管理、采購(gòu)管理和系統(tǒng)管理等多個(gè)方

    2024年01月23日
    瀏覽(104)
  • 【Java】智慧工地管理系統(tǒng)源代碼,支持二次開發(fā),SaaS模式

    【Java】智慧工地管理系統(tǒng)源代碼,支持二次開發(fā),SaaS模式

    智慧工地系統(tǒng)圍繞工程現(xiàn)場(chǎng)人、機(jī)、料、法、環(huán)及施工過(guò)程中質(zhì)量、安全、進(jìn)度、成本等各項(xiàng)數(shù)據(jù)滿足工地多角色、多視角的有效監(jiān)管,實(shí)現(xiàn)工程建設(shè)管理的降本增效。 1、施工現(xiàn)場(chǎng)管理難:安全事故頻發(fā),人工巡檢難度大,質(zhì)量進(jìn)度協(xié)同難等問(wèn)題仍沒有得到解決; 2.人員管理

    2024年02月04日
    瀏覽(21)
  • Flink--8、時(shí)間語(yǔ)義、水位線(事件和窗口、水位線和窗口的工作原理、生產(chǎn)水位線、水位線的傳遞、遲到數(shù)據(jù)的處理)

    Flink--8、時(shí)間語(yǔ)義、水位線(事件和窗口、水位線和窗口的工作原理、生產(chǎn)水位線、水位線的傳遞、遲到數(shù)據(jù)的處理)

    ?????????????????????? 星光下的趕路人star的個(gè)人主頁(yè) ?????????????????????? 將自己生命力展開的人,他的存在,對(duì)別人就是愈療 1、從《星球大戰(zhàn)》說(shuō)起 為了更加清晰地說(shuō)明兩種語(yǔ)義的區(qū)別,我們來(lái)舉一個(gè)非常經(jīng)典的例

    2024年02月07日
    瀏覽(23)
  • 譜圖論:Laplacian二次型和Markov轉(zhuǎn)移算子

    以下部分是我學(xué)習(xí)CMU 15-751: TCS Toolkit的課堂筆記。由于只是個(gè)人筆記,因此許多地方在推導(dǎo)上可能不那么嚴(yán)謹(jǐn),還望理論大佬多多包涵。 在本文中,我們將研究對(duì)象限定在無(wú)向圖(undirected graph) (G=(V, E)) ,且滿足: 有限(finite); 允許重邊和自環(huán); 不允許度為0的頂點(diǎn)(即

    2024年02月08日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包