实时数仓(六)DWM层双流join(订单表和订单明细表join)

DWM层双流join(订单表和订单明细表join)

官方文档:
https://nightlies.apache.org/flink/flink-docs-release-1.12/dev/stream/operators/joining.html
在这里插入图片描述
在这里插入图片描述
代码实现:

package com.yyds.app.dwm;

import com.alibaba.fastjson.JSONObject;
import com.yyds.bean.OrderDetail;
import com.yyds.bean.OrderInfo;
import com.yyds.bean.OrderWide;
import com.yyds.utils.MyKafkaUtils;
import org.apache.flink.api.common.eventtime.SerializableTimestampAssigner;
import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.runtime.state.filesystem.FsStateBackend;
import org.apache.flink.streaming.api.CheckpointingMode;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.CheckpointConfig;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.co.ProcessJoinFunction;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.util.Collector;

import java.text.SimpleDateFormat;

/**
 * dwm层订单宽表
 */
public class OrderWideApp {
    public static void main(String[] args) throws Exception {
        // TODO 1、获取执行环境
        System.setProperty("HADOOP_USER_NAME","root");

        // 获取执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);

        // 开启 Checkpoint,每隔 5 秒钟做一次 Checkpoint
        env.enableCheckpointing(5000L);
        //指定 CK 的一致性语义
        env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
        // 设置超时时间
        //env.getCheckpointConfig().setAlignmentTimeout(10000L);
        env.getCheckpointConfig().setMaxConcurrentCheckpoints(2);
        env.getCheckpointConfig().setMinPauseBetweenCheckpoints(3000L);
        // 重启策略
//        env.setRestartStrategy(RestartStrategies.fixedDelayRestart(3,5000L));
        //设置任务关闭的时候保留最后一次 CK 数据
        env.getCheckpointConfig().enableExternalizedCheckpoints(
                CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION
        );
        // 设置状态后端
        env.setStateBackend(new FsStateBackend("hdfs://centos01:8020/flinkCDC/ck"));

        // TODO 2、获取dwd中kafka中订单和订单明细数据   转换为javaBean对象  提取时间戳 并生成watermark
        String orderInfoSourceTopic = "dwd_order_info";
        String orderDetailSourceTopic = "dwd_order_detail";
        String orderWideSinkTopic = "dwm_order_wide";
        String groupId = "order_wide_group";


        SingleOutputStreamOperator<OrderInfo> orderInfoStreamOperator = env
                .addSource(MyKafkaUtils.getKafkaConsumer(orderInfoSourceTopic, groupId))
                .map(line -> {
                    OrderInfo orderInfo = JSONObject.parseObject(line, OrderInfo.class);
                    // 补充字段
                    String create_time = orderInfo.getCreate_time();
                    String[] dateTimeArr = create_time.split(" ");

                    orderInfo.setCreate_date(dateTimeArr[0]);
                    orderInfo.setCreate_hour(dateTimeArr[1].split(":")[0]);

                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    long ts = sdf.parse(create_time).getTime();
                    orderInfo.setCreate_ts(ts);

                    return orderInfo;
                })
                .assignTimestampsAndWatermarks(
                        WatermarkStrategy.<OrderInfo>forMonotonousTimestamps()
                                .withTimestampAssigner(new SerializableTimestampAssigner<OrderInfo>() {

                                    @Override
                                    public long extractTimestamp(OrderInfo element, long recordTimestamp) {
                                        return element.getCreate_ts();
                                    }
                                }));


        SingleOutputStreamOperator<OrderDetail> orderDetailStreamOperator = env.addSource(MyKafkaUtils.getKafkaConsumer(orderDetailSourceTopic, groupId))
                .map(line -> {
                    OrderDetail orderDetail = JSONObject.parseObject(line, OrderDetail.class);
                    // 补充字段
                    String create_time = orderDetail.getCreate_time();

                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    long ts = sdf.parse(create_time).getTime();
                    orderDetail.setCreate_ts(ts);

                    return orderDetail;
                })
                .assignTimestampsAndWatermarks(
                        WatermarkStrategy.<OrderDetail>forMonotonousTimestamps()
                                .withTimestampAssigner(new SerializableTimestampAssigner<OrderDetail>() {

                                    @Override
                                    public long extractTimestamp(OrderDetail element, long recordTimestamp) {
                                        return element.getCreate_ts();
                                    }
                                }));


        // TODO 3、双流join
        /*
        orangeStream
            .keyBy(<KeySelector>)
            .intervalJoin(greenStream.keyBy(<KeySelector>))
            .between(Time.milliseconds(-2), Time.milliseconds(1))
            .process (new ProcessJoinFunction<Integer, Integer, String(){

                @Override
                public void processElement(Integer left, Integer right, Context ctx, Collector<String> out) {
                    out.collect(left + "," + right);
                }
        });
         */
        SingleOutputStreamOperator<OrderWide> joinedOrderWideDS = orderInfoStreamOperator
                .keyBy(orderInfo -> orderInfo.getId())
                .intervalJoin(orderDetailStreamOperator.keyBy(orderDetail -> orderDetail.getOrder_id()))
                .between(Time.seconds(-5), Time.seconds(5)) // 最大延迟时间
                .process(new ProcessJoinFunction<OrderInfo, OrderDetail, OrderWide>() {

                    @Override
                    public void processElement(OrderInfo orderInfo, OrderDetail orderDetail, Context ctx, Collector<OrderWide> out) throws Exception {
                        out.collect(new OrderWide(orderInfo, orderDetail));
                    }
                });


        joinedOrderWideDS.print("joinedOrderWideDS-------------");
        // TODO 4、关联维度信息


        // TODO 5、将数据写入kafka


        // TODO 6、启动任务
        env.execute("OrderWideApp");

    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在数据仓库中,ODS、DWD、DWS、DM、DIM和DWM都是一些常见的术语缩写,它们是数据仓库的不同次或模块,具体含义如下: 1. ODS(Operational Data Store):操作型数据存储。ODS是数据仓库中的第一,用于存储从各个业务系统中提取的源数据,该的数据结构、粒度和格式都与源系统保持一致,是数据仓库中数据处理的第一步。 2. DWD(Data Warehouse Detail):数据仓库明细。DWD是数据仓库中的第二,用于存储经过清洗、集成和加工后的数据,该的数据结构、粒度和格式都已经进行了标准化和统一,是数据仓库中最主要的数据存储。 3. DWS(Data Warehouse Summary):数据仓库汇总。DWS是数据仓库中的第三,用于存储对DWD数据进行聚合、计算和汇总后的结果,该的数据结构、粒度和格式都已经进行了优化和压缩,是支持数据分析和决策的重要数据源。 4. DM(Data Mart):数据集市。DM是数据仓库中的一个分支或子集,用于针对具体业务需求和分析场景,对DWD和DWS的数据进行再加工和汇总,以支持更精细化和个性化的数据分析和决策。 5. DIM(Dimension):维度。DIM是数据仓库中的一个重要概念,用于描述业务数据的各种维度属性,如时间、地域、产品、客户等,是数据分析和报展示的基础和关键。 6. DWMData Warehouse Metadata):数据仓库元数据DWM是数据仓库中的一个特殊,用于存储数据仓库中各种对象和元素的定义和描述信息,如、视图、报、指标、度量等,是数据仓库管理和维护的基础和关键。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值