做电商卖玉器的网站,网站开发中要做哪些东西,红河网页设计,做商品网站数据库有哪些内容Flink 系列文章
一、Flink 专栏
Flink 专栏系统介绍某一知识点#xff0c;并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分#xff0c;比如术语、架构、编程模型、编程指南、基本的…Flink 系列文章
一、Flink 专栏
Flink 专栏系统介绍某一知识点并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分比如术语、架构、编程模型、编程指南、基本的datastream api用法、四大基石等内容。 3、Flik Table API和SQL基础系列 本部分介绍Flink Table Api和SQL的基本用法比如Table API和SQL创建库、表用法、查询、窗口函数、catalog等等内容。 4、Flik Table API和SQL提高与应用系列 本部分是table api 和sql的应用部分和实际的生产应用联系更为密切以及有一定开发难度的内容。 5、Flink 监控系列 本部分和实际的运维、监控工作相关。
二、Flink 示例专栏
Flink 示例专栏是 Flink 专栏的辅助说明一般不会介绍知识点的信息更多的是提供一个一个可以具体使用的示例。本专栏不再分目录通过链接即可看出介绍的内容。
两专栏的所有文章入口点击Flink 系列文章汇总索引 文章目录 Flink 系列文章一、Flink的23种算子说明及示例9、first、distinct、join、outjoin、cross10、Window11、WindowAll12、Window Apply13、Window Reduce14、Aggregations on windows 本文主要介绍Flink 的10种常用的operatorwindow、distinct、join等及以具体可运行示例进行说明. 如果需要了解更多内容可以在本人Flink 专栏中了解更新系统的内容。 本文除了maven依赖外没有其他依赖。
本专题分为五篇即 【flink番外篇】1、flink的23种常用算子介绍及详细示例1- map、flatmap和filter 【flink番外篇】1、flink的23种常用算子介绍及详细示例2- keyby、reduce和Aggregations 【flink番外篇】1、flink的23种常用算子介绍及详细示例3-window、distinct、join等 【flink番外篇】1、flink的23种常用算子介绍及详细示例4- union、window join、connect、outputtag、cache、iterator、project 【flink番外篇】1、flink的23种常用算子介绍及详细示例完整版
一、Flink的23种算子说明及示例
本文示例中使用的maven依赖和java bean 参考本专题的第一篇中的maven和java bean。
9、first、distinct、join、outjoin、cross
具体事例详见例子及结果。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.JoinFunction;
import org.apache.flink.api.common.operators.Order;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.api.java.operators.DataSource;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.java.tuple.Tuple3;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;
import org.datastreamapi.User;/*** author alanchan**/
public class TestFirst_Join_Distinct_OutJoin_CrossDemo {public static void main(String[] args) throws Exception {ExecutionEnvironment env ExecutionEnvironment.getExecutionEnvironment();joinFunction(env);env.execute();}public static void unionFunction(StreamExecutionEnvironment env) throws Exception {ListString info1 new ArrayList();info1.add(team A);info1.add(team B);ListString info2 new ArrayList();info2.add(team C);info2.add(team D);ListString info3 new ArrayList();info3.add(team E);info3.add(team F);ListString info4 new ArrayList();info4.add(team G);info4.add(team H);DataStreamString source1 env.fromCollection(info1);DataStreamString source2 env.fromCollection(info2);DataStreamString source3 env.fromCollection(info3);DataStreamString source4 env.fromCollection(info4);source1.union(source2).union(source3).union(source4).print();
// team A
// team C
// team E
// team G
// team B
// team D
// team F
// team H}public static void crossFunction(ExecutionEnvironment env) throws Exception {// cross,求两个集合的笛卡尔积,得到的结果数为集合1的条数 乘以 集合2的条数ListString info1 new ArrayList();info1.add(team A);info1.add(team B);ListTuple2String, Integer info2 new ArrayList();info2.add(new Tuple2(W, 3));info2.add(new Tuple2(D, 1));info2.add(new Tuple2(L, 0));DataSourceString data1 env.fromCollection(info1);DataSourceTuple2String, Integer data2 env.fromCollection(info2);data1.cross(data2).print();
// (team A,(W,3))
// (team A,(D,1))
// (team A,(L,0))
// (team B,(W,3))
// (team B,(D,1))
// (team B,(L,0))}public static void outerJoinFunction(ExecutionEnvironment env) throws Exception {// Outjoin,跟sql语句中的left join,right join,full join意思一样// leftOuterJoin,跟join一样但是左边集合的没有关联上的结果也会取出来,没关联上的右边为null// rightOuterJoin,跟join一样,但是右边集合的没有关联上的结果也会取出来,没关联上的左边为null// fullOuterJoin,跟join一样,但是两个集合没有关联上的结果也会取出来,没关联上的一边为nullListTuple2Integer, String info1 new ArrayList();info1.add(new Tuple2(1, shenzhen));info1.add(new Tuple2(2, guangzhou));info1.add(new Tuple2(3, shanghai));info1.add(new Tuple2(4, chengdu));ListTuple2Integer, String info2 new ArrayList();info2.add(new Tuple2(1, 深圳));info2.add(new Tuple2(2, 广州));info2.add(new Tuple2(3, 上海));info2.add(new Tuple2(5, 杭州));DataSourceTuple2Integer, String data1 env.fromCollection(info1);DataSourceTuple2Integer, String data2 env.fromCollection(info2);// left join
// eft join:7 (1,shenzhen,深圳)
// left join:2 (3,shanghai,上海)
// left join:8 (4,chengdu,未知)
// left join:16 (2,guangzhou,广州)data1.leftOuterJoin(data2).where(0).equalTo(0).with(new JoinFunctionTuple2Integer, String, Tuple2Integer, String, Tuple3Integer, String, String() {Overridepublic Tuple3Integer, String, String join(Tuple2Integer, String first, Tuple2Integer, String second) throws Exception {Tuple3Integer, String, String tuple new Tuple3();if (second null) {tuple.setField(first.f0, 0);tuple.setField(first.f1, 1);tuple.setField(未知, 2);} else {// 另外一种赋值方式和直接用构造函数赋值相同tuple.setField(first.f0, 0);tuple.setField(first.f1, 1);tuple.setField(second.f1, 2);}return tuple;}}).print(left join);// right join
// right join:2 (3,shanghai,上海)
// right join:7 (1,shenzhen,深圳)
// right join:15 (5,--,杭州)
// right join:16 (2,guangzhou,广州)data1.rightOuterJoin(data2).where(0).equalTo(0).with(new JoinFunctionTuple2Integer, String, Tuple2Integer, String, Tuple3Integer, String, String() {Overridepublic Tuple3Integer, String, String join(Tuple2Integer, String first, Tuple2Integer, String second) throws Exception {Tuple3Integer, String, String tuple new Tuple3();if (first null) {tuple.setField(second.f0, 0);tuple.setField(--, 1);tuple.setField(second.f1, 2);} else {// 另外一种赋值方式和直接用构造函数赋值相同tuple.setField(first.f0, 0);tuple.setField(first.f1, 1);tuple.setField(second.f1, 2);}return tuple;}}).print(right join);// fullOuterJoin
// fullOuterJoin:2 (3,shanghai,上海)
// fullOuterJoin:8 (4,chengdu,--)
// fullOuterJoin:15 (5,--,杭州)
// fullOuterJoin:16 (2,guangzhou,广州)
// fullOuterJoin:7 (1,shenzhen,深圳)data1.fullOuterJoin(data2).where(0).equalTo(0).with(new JoinFunctionTuple2Integer, String, Tuple2Integer, String, Tuple3Integer, String, String() {Overridepublic Tuple3Integer, String, String join(Tuple2Integer, String first, Tuple2Integer, String second) throws Exception {Tuple3Integer, String, String tuple new Tuple3();if (second null) {tuple.setField(first.f0, 0);tuple.setField(first.f1, 1);tuple.setField(--, 2);} else if (first null) {tuple.setField(second.f0, 0);tuple.setField(--, 1);tuple.setField(second.f1, 2);} else {// 另外一种赋值方式和直接用构造函数赋值相同tuple.setField(first.f0, 0);tuple.setField(first.f1, 1);tuple.setField(second.f1, 2);}return tuple;}}).print(fullOuterJoin);}public static void joinFunction(ExecutionEnvironment env) throws Exception {ListTuple2Integer, String info1 new ArrayList();info1.add(new Tuple2(1, shenzhen));info1.add(new Tuple2(2, guangzhou));info1.add(new Tuple2(3, shanghai));info1.add(new Tuple2(4, chengdu));ListTuple2Integer, String info2 new ArrayList();info2.add(new Tuple2(1, 深圳));info2.add(new Tuple2(2, 广州));info2.add(new Tuple2(3, 上海));info2.add(new Tuple2(5, 杭州));DataSourceTuple2Integer, String data1 env.fromCollection(info1);DataSourceTuple2Integer, String data2 env.fromCollection(info2);//// join:2 ((3,shanghai),(3,上海))
// join:16 ((2,guangzhou),(2,广州))
// join:7 ((1,shenzhen),(1,深圳))data1.join(data2).where(0).equalTo(0).print(join);// join2:2 (3,上海,shanghai)
// join2:7 (1,深圳,shenzhen)
// join2:16 (2,广州,guangzhou)DataSetTuple3Integer, String, String data3 data1.join(data2).where(0).equalTo(0).with(new JoinFunctionTuple2Integer, String, Tuple2Integer, String, Tuple3Integer, String, String() {Overridepublic Tuple3Integer, String, String join(Tuple2Integer, String first, Tuple2Integer, String second) throws Exception {return new Tuple3Integer, String, String(first.f0, second.f1, first.f1);}});data3.print(join2);}public static void firstFunction(ExecutionEnvironment env) throws Exception {ListTuple2Integer, String info new ArrayList();info.add(new Tuple2(1, Hadoop));info.add(new Tuple2(1, Spark));info.add(new Tuple2(1, Flink));info.add(new Tuple2(2, Scala));info.add(new Tuple2(2, Java));info.add(new Tuple2(2, Python));info.add(new Tuple2(3, Linux));info.add(new Tuple2(3, Window));info.add(new Tuple2(3, MacOS));DataSetTuple2Integer, String dataSet env.fromCollection(info);// 前几个
// dataSet.first(4).print();
// (1,Hadoop)
// (1,Spark)
// (1,Flink)
// (2,Scala)// 按照tuple2的第一个元素进行分组查出每组的前2个
// dataSet.groupBy(0).first(2).print();
// (3,Linux)
// (3,Window)
// (1,Hadoop)
// (1,Spark)
// (2,Scala)
// (2,Java)// 按照tpule2的第一个元素进行分组并按照倒序排列查出每组的前2个dataSet.groupBy(0).sortGroup(1, Order.DESCENDING).first(2).print();
// (3,Window)
// (3,MacOS)
// (1,Spark)
// (1,Hadoop)
// (2,Scala)
// (2,Python)}public static void distinctFunction(ExecutionEnvironment env) throws Exception {List list new ArrayListTuple3Integer, Integer, Integer();list.add(new Tuple3(0, 3, 6));list.add(new Tuple3(0, 2, 5));list.add(new Tuple3(0, 3, 6));list.add(new Tuple3(1, 1, 9));list.add(new Tuple3(1, 2, 8));list.add(new Tuple3(1, 2, 8));list.add(new Tuple3(1, 3, 9));DataSetTuple3Integer, Integer, Integer source env.fromCollection(list);// 去除tuple3中元素完全一样的source.distinct().print();
// (1,3,9)
// (0,3,6)
// (1,1,9)
// (1,2,8)
// (0,2,5)// 去除tuple3中第一个元素一样的只保留第一个// source.distinct(0).print();
// (1,1,9)
// (0,3,6)// 去除tuple3中第一个和第三个相同的元素只保留第一个// source.distinct(0,2).print();
// (0,3,6)
// (1,1,9)
// (1,2,8)
// (0,2,5)}public static void distinctFunction2(ExecutionEnvironment env) throws Exception {DataSetUser source env.fromCollection(Arrays.asList(new User(1, alan1, 1, 11.com, 18, 3000), new User(2, alan2, 2, 22.com, 19, 200),new User(3, alan1, 3, 33.com, 18, 1000), new User(5, alan1, 5, 55.com, 28, 1500), new User(4, alan2, 4, 44.com, 20, 300)));// source.distinct(name).print();
// User(id2, namealan2, pwd2, email22.com, age19, balance200.0)
// User(id1, namealan1, pwd1, email11.com, age18, balance3000.0)source.distinct(name, age).print();
// User(id1, namealan1, pwd1, email11.com, age18, balance3000.0)
// User(id2, namealan2, pwd2, email22.com, age19, balance200.0)
// User(id5, namealan1, pwd5, email55.com, age28, balance1500.0)
// User(id4, namealan2, pwd4, email44.com, age20, balance300.0)}public static void distinctFunction3(ExecutionEnvironment env) throws Exception {DataSetUser source env.fromCollection(Arrays.asList(new User(1, alan1, 1, 11.com, 18, -1000), new User(2, alan2, 2, 22.com, 19, 200),new User(3, alan1, 3, 33.com, 18, -1000), new User(5, alan1, 5, 55.com, 28, 1500), new User(4, alan2, 4, 44.com, 20, -300)));// 针对balance增加绝对值去重source.distinct(new KeySelectorUser, Double() {Overridepublic Double getKey(User value) throws Exception {return Math.abs(value.getBalance());}}).print();
// User(id5, namealan1, pwd5, email55.com, age28, balance1500.0)
// User(id2, namealan2, pwd2, email22.com, age19, balance200.0)
// User(id1, namealan1, pwd1, email11.com, age18, balance-1000.0)
// User(id4, namealan2, pwd4, email44.com, age20, balance-300.0)}public static void distinctFunction4(ExecutionEnvironment env) throws Exception {ListString info new ArrayList();info.add(Hadoop,Spark);info.add(Spark,Flink);info.add(Hadoop,Flink);info.add(Hadoop,Flink);DataSetString source env.fromCollection(info);source.flatMap(new FlatMapFunctionString, String() {Overridepublic void flatMap(String value, CollectorString out) throws Exception {System.err.print(come in );for (String token : value.split(,)) {out.collect(token);}}});source.distinct().print();}}
10、Window
KeyedStream → WindowedStream Window 函数允许按时间或其他条件对现有 KeyedStream 进行分组。 以下是以 10 秒的时间窗口聚合
inputStream.keyBy(0).window(Time.seconds(10));Flink 定义数据片段以便可能处理无限数据流。 这些切片称为窗口。 此切片有助于通过应用转换处理数据块。 要对流进行窗口化需要分配一个可以进行分发的键和一个描述要对窗口化流执行哪些转换的函数。要将流切片到窗口可以使用 Flink 自带的窗口分配器。 我们有选项如 tumbling windows, sliding windows, global 和 session windows。 具体参考系列文章 6、Flink四大基石之Window详解与详细示例一 6、Flink四大基石之Window详解与详细示例二 7、Flink四大基石之Time和WaterMaker详解与详细示例watermaker基本使用、kafka作为数据源的watermaker使用示例以及超出最大允许延迟数据的接收实现
11、WindowAll
DataStream → AllWindowedStream windowAll 函数允许对常规数据流进行分组。 通常这是非并行数据转换因为它在非分区数据流上运行。 与常规数据流功能类似也有窗口数据流功能。 唯一的区别是它们处理窗口数据流。 所以窗口缩小就像 Reduce 函数一样Window fold 就像 Fold 函数一样并且还有聚合。
dataStream.windowAll(TumblingEventTimeWindows.of(Time.seconds(5))); // Last 5 seconds of data这适用于非并行转换的大多数场景。所有记录都将收集到 windowAll 算子对应的一个任务中。 具体参考系列文章 6、Flink四大基石之Window详解与详细示例一 6、Flink四大基石之Window详解与详细示例二 7、Flink四大基石之Time和WaterMaker详解与详细示例watermaker基本使用、kafka作为数据源的watermaker使用示例以及超出最大允许延迟数据的接收实现
12、Window Apply
WindowedStream → DataStream AllWindowedStream → DataStream 将通用 function 应用于整个窗口。下面是一个手动对窗口内元素求和的 function。 如果你使用 windowAll 转换则需要改用 AllWindowFunction。 windowedStream.apply(new WindowFunctionTuple2String,Integer, Integer, Tuple, Window() {public void apply (Tuple tuple,Window window,IterableTuple2String, Integer values,CollectorInteger out) throws Exception {int sum 0;for (value t: values) {sum t.f1;}out.collect (new Integer(sum));}
});// 在 non-keyed 窗口流上应用 AllWindowFunction
allWindowedStream.apply (new AllWindowFunctionTuple2String,Integer, Integer, Window() {public void apply (Window window,IterableTuple2String, Integer values,CollectorInteger out) throws Exception {int sum 0;for (value t: values) {sum t.f1;}out.collect (new Integer(sum));}
});13、Window Reduce
WindowedStream → DataStream 对窗口应用 reduce function 并返回 reduce 后的值。
windowedStream.reduce (new ReduceFunctionTuple2String,Integer() {public Tuple2String, Integer reduce(Tuple2String, Integer value1, Tuple2String, Integer value2) throws Exception {return new Tuple2String,Integer(value1.f0, value1.f1 value2.f1);}
});14、Aggregations on windows
WindowedStream → DataStream 聚合窗口的内容。min和minBy之间的区别在于min返回最小值而minBy返回该字段中具有最小值的元素max和maxBy相同。
windowedStream.sum(0);
windowedStream.sum(key);
windowedStream.min(0);
windowedStream.min(key);
windowedStream.max(0);
windowedStream.max(key);
windowedStream.minBy(0);
windowedStream.minBy(key);
windowedStream.maxBy(0);
windowedStream.maxBy(key);以上本文主要介绍Flink 的10种常用的operatorwindow、distinct、join等及以具体可运行示例进行说明. 如果需要了解更多内容可以在本人Flink 专栏中了解更新系统的内容。
本专题分为五篇即 【flink番外篇】1、flink的23种常用算子介绍及详细示例1- map、flatmap和filter 【flink番外篇】1、flink的23种常用算子介绍及详细示例2- keyby、reduce和Aggregations 【flink番外篇】1、flink的23种常用算子介绍及详细示例3-window、distinct、join等 【flink番外篇】1、flink的23种常用算子介绍及详细示例4- union、window join、connect、outputtag、cache、iterator、project 【flink番外篇】1、flink的23种常用算子介绍及详细示例完整版 文章转载自: http://www.morning.qsy40.cn.gov.cn.qsy40.cn http://www.morning.rcqyk.cn.gov.cn.rcqyk.cn http://www.morning.ykrkb.cn.gov.cn.ykrkb.cn http://www.morning.xhgxd.cn.gov.cn.xhgxd.cn http://www.morning.fqsxf.cn.gov.cn.fqsxf.cn http://www.morning.prxqd.cn.gov.cn.prxqd.cn http://www.morning.ytfr.cn.gov.cn.ytfr.cn http://www.morning.qbwtb.cn.gov.cn.qbwtb.cn http://www.morning.nlcw.cn.gov.cn.nlcw.cn http://www.morning.rwjtf.cn.gov.cn.rwjtf.cn http://www.morning.srgsb.cn.gov.cn.srgsb.cn http://www.morning.crdtx.cn.gov.cn.crdtx.cn http://www.morning.rnqnp.cn.gov.cn.rnqnp.cn http://www.morning.pqwhk.cn.gov.cn.pqwhk.cn http://www.morning.gwmny.cn.gov.cn.gwmny.cn http://www.morning.ryzgp.cn.gov.cn.ryzgp.cn http://www.morning.hhmfp.cn.gov.cn.hhmfp.cn http://www.morning.rbmnq.cn.gov.cn.rbmnq.cn http://www.morning.jqcrf.cn.gov.cn.jqcrf.cn http://www.morning.prjty.cn.gov.cn.prjty.cn http://www.morning.lfqnk.cn.gov.cn.lfqnk.cn http://www.morning.hbqhz.cn.gov.cn.hbqhz.cn http://www.morning.tbqbd.cn.gov.cn.tbqbd.cn http://www.morning.drqrl.cn.gov.cn.drqrl.cn http://www.morning.ncrk.cn.gov.cn.ncrk.cn http://www.morning.fqljq.cn.gov.cn.fqljq.cn http://www.morning.yfmxn.cn.gov.cn.yfmxn.cn http://www.morning.rdkqt.cn.gov.cn.rdkqt.cn http://www.morning.hrzky.cn.gov.cn.hrzky.cn http://www.morning.ttrdr.cn.gov.cn.ttrdr.cn http://www.morning.ynryz.cn.gov.cn.ynryz.cn http://www.morning.xbbrh.cn.gov.cn.xbbrh.cn http://www.morning.rccpl.cn.gov.cn.rccpl.cn http://www.morning.wztlr.cn.gov.cn.wztlr.cn http://www.morning.hqnsf.cn.gov.cn.hqnsf.cn http://www.morning.csnmd.cn.gov.cn.csnmd.cn http://www.morning.djpps.cn.gov.cn.djpps.cn http://www.morning.jhrkm.cn.gov.cn.jhrkm.cn http://www.morning.jcfdk.cn.gov.cn.jcfdk.cn http://www.morning.mhmcr.cn.gov.cn.mhmcr.cn http://www.morning.rjrnx.cn.gov.cn.rjrnx.cn http://www.morning.cjrmf.cn.gov.cn.cjrmf.cn http://www.morning.slkqd.cn.gov.cn.slkqd.cn http://www.morning.qrwnj.cn.gov.cn.qrwnj.cn http://www.morning.rwmq.cn.gov.cn.rwmq.cn http://www.morning.lqjlg.cn.gov.cn.lqjlg.cn http://www.morning.mxptg.cn.gov.cn.mxptg.cn http://www.morning.wsrcy.cn.gov.cn.wsrcy.cn http://www.morning.dzpnl.cn.gov.cn.dzpnl.cn http://www.morning.ywndg.cn.gov.cn.ywndg.cn http://www.morning.kjcll.cn.gov.cn.kjcll.cn http://www.morning.jzdfc.cn.gov.cn.jzdfc.cn http://www.morning.nrchx.cn.gov.cn.nrchx.cn http://www.morning.rgnq.cn.gov.cn.rgnq.cn http://www.morning.cwwts.cn.gov.cn.cwwts.cn http://www.morning.rzmsl.cn.gov.cn.rzmsl.cn http://www.morning.gywxq.cn.gov.cn.gywxq.cn http://www.morning.rkqzx.cn.gov.cn.rkqzx.cn http://www.morning.npcxk.cn.gov.cn.npcxk.cn http://www.morning.rmfwh.cn.gov.cn.rmfwh.cn http://www.morning.yhjrc.cn.gov.cn.yhjrc.cn http://www.morning.gxtfk.cn.gov.cn.gxtfk.cn http://www.morning.jopebe.cn.gov.cn.jopebe.cn http://www.morning.jfzbk.cn.gov.cn.jfzbk.cn http://www.morning.ngmjn.cn.gov.cn.ngmjn.cn http://www.morning.mpwgs.cn.gov.cn.mpwgs.cn http://www.morning.zbgqt.cn.gov.cn.zbgqt.cn http://www.morning.tsyny.cn.gov.cn.tsyny.cn http://www.morning.ydzly.cn.gov.cn.ydzly.cn http://www.morning.zplzj.cn.gov.cn.zplzj.cn http://www.morning.lkhfm.cn.gov.cn.lkhfm.cn http://www.morning.gmgnp.cn.gov.cn.gmgnp.cn http://www.morning.wjyyg.cn.gov.cn.wjyyg.cn http://www.morning.jgykx.cn.gov.cn.jgykx.cn http://www.morning.kwhrq.cn.gov.cn.kwhrq.cn http://www.morning.ktmbp.cn.gov.cn.ktmbp.cn http://www.morning.ntkpc.cn.gov.cn.ntkpc.cn http://www.morning.znnsk.cn.gov.cn.znnsk.cn http://www.morning.kxqwg.cn.gov.cn.kxqwg.cn http://www.morning.qqhfc.cn.gov.cn.qqhfc.cn