【实时数仓】DWS层之商品主题计算、地区主题表(FlinkSQL)

news2024/11/18 15:25:05

文章目录

  • 一 DWS层-商品主题计算
    • 1 把JSON字符串数据流转换为统一数据对象的数据流
      • (1)转换订单宽表流数据
      • (2)转换支付宽表流数据
    • 2 把统一的数据结构流合并为一个流
      • (1)代码
      • (2)测试
    • 3 设定事件时间与水位线
    • 4 分组、开窗、聚合
    • 5 补充商品维度信息
      • (1)关联商品维度
      • (2)关联SPU维度
      • (3)关联品类维度
      • (4)关联品牌维度
      • (5)测试
    • 6 写入ClickHouse
      • (1)在ClickHouse中创建商品主题宽表
      • (2)为主程序增加写入ClickHouse的Sink
      • (3)整体测试
  • 二 DWS层-地区主题表(FlinkSQL)
    • 1 需求分析与思路
    • 2 在pom.xml文件中添加FlinkSQL相关依赖
    • 3 创建ProvinceStatsSqlApp,定义Table流环境
    • 4 MyKafkaUtil增加一个DDL的方法
    • 5 把数据源定义为动态表并指定水位线
      • (1)指定`WATERMARK`
      • (2)系统内置函数
      • (3)给计算列起别名
      • (4)完整代码

一 DWS层-商品主题计算

1 把JSON字符串数据流转换为统一数据对象的数据流

(1)转换订单宽表流数据

// 4.6 转换订单宽表流数据
SingleOutputStreamOperator<ProductStats> orderWideStatsDS = orderWideStrDS.map(
        new MapFunction<String, ProductStats>() {
            @Override
            public ProductStats map(String jsonStr) throws Exception {
                OrderWide orderWide = JSON.parseObject(jsonStr, OrderWide.class);
                ProductStats productStats = ProductStats.builder()
                        .sku_id(orderWide.getSku_id())
                        .order_sku_num(orderWide.getSku_num())
                        .order_amount(orderWide.getSplit_total_amount())
                        .ts(DateTimeUtil.toTs(orderWide.getCreate_time()))
                        .orderIdSet(new HashSet(Collections.singleton(orderWide.getOrder_id())))
                        .build();
                return productStats;
            }
        }
);

(2)转换支付宽表流数据

// 4.7 转换支付宽表流数据
SingleOutputStreamOperator<ProductStats> paymentWideStatsDS = paymentWideStrDS.map(
        new MapFunction<String, ProductStats>() {
            @Override
            public ProductStats map(String jsonStr) throws Exception {
                PaymentWide paymentWide = JSON.parseObject(jsonStr, PaymentWide.class);
                ProductStats productStats = ProductStats.builder()
                        .sku_id(paymentWide.getSku_id())
                        .payment_amount(paymentWide.getSplit_total_amount())
                        .paidOrderIdSet(new HashSet(Collections.singleton(paymentWide.getOrder_id())))
                        .ts(DateTimeUtil.toTs(paymentWide.getCallback_time()))
                        .build();
                return productStats;
            }
        }
);

2 把统一的数据结构流合并为一个流

(1)代码

// TODO 5 将不同流的数据通过union合并到一起
DataStream<ProductStats> unionDS = clickAndDisplayStatsDS.union(
        favorStatsDS,
        cartStatsDS,
        refundStatsDS,
        commentStatsDS,
        orderWideStatsDS,
        paymentWideStatsDS
);

unionDS.print(">>>");

(2)测试

  • 启动ZK、Kafka、logger.sh、ClickHouse、Redis、HDFS、Hbase、Maxwell

    redis-server /home/hzy/redis2022.conf 
    sudo systemctl start clickhouse-server
    
  • 运行BaseLogApp

  • 运行BaseDBApp

  • 运行OrderWideApp

  • 运行PaymentWideApp

  • 运行ProductsStatsApp

  • 运行rt_applog目录下的jar包(可以获取到曝光 display_ct和点击数据click_ct)

  • 运行rt_dblog目录下的jar包(可以获取到sku_id、cart_ct、favor_ct,下单数量,下单金额、orderIdSet等)

  • 查看控制台输出(如电脑性能不够,可以将日志和业务两条线分开测试)

3 设定事件时间与水位线

// TODO 6 指定watermark以及提取时间时间字段
SingleOutputStreamOperator<ProductStats> productStatsWithWatermarkDS = unionDS.assignTimestampsAndWatermarks(
        WatermarkStrategy.<ProductStats>forBoundedOutOfOrderness(Duration.ofSeconds(3))
                .withTimestampAssigner(
                        new SerializableTimestampAssigner<ProductStats>() {
                            @Override
                            public long extractTimestamp(ProductStats productStats, long recordTimestamp) {
                                return productStats.getTs();
                            }
                        }
                )
);

4 分组、开窗、聚合

// TODO 7 分组 -- 按照商品id分组
KeyedStream<ProductStats, Long> keyedDS = productStatsWithWatermarkDS.keyBy(ProductStats::getSku_id);

// TODO 8 开窗
WindowedStream<ProductStats, Long, TimeWindow> windowDS = keyedDS.window(TumblingEventTimeWindows.of(Time.seconds(10)));

// TODO 9 聚合计算
SingleOutputStreamOperator<ProductStats> reduceDS = windowDS.reduce(
        new ReduceFunction<ProductStats>() {
            @Override
            public ProductStats reduce(ProductStats stats1, ProductStats stats2) throws Exception {
                stats1.setDisplay_ct(stats1.getDisplay_ct() + stats2.getDisplay_ct());
                stats1.setClick_ct(stats1.getClick_ct() + stats2.getClick_ct());
                stats1.setCart_ct(stats1.getCart_ct() + stats2.getCart_ct());
                stats1.setFavor_ct(stats1.getFavor_ct() + stats2.getFavor_ct());
                stats1.setOrder_amount(stats1.getOrder_amount().add(stats2.getOrder_amount()));

                stats1.getOrderIdSet().addAll(stats2.getOrderIdSet());
                stats1.setOrder_ct(stats1.getOrderIdSet().size() + 0L);

                stats1.setOrder_sku_num(stats1.getOrder_sku_num() + stats2.getOrder_sku_num());
                stats1.setPayment_amount(stats1.getPayment_amount().add(stats2.getPayment_amount()));

                stats1.getRefundOrderIdSet().addAll(stats2.getRefundOrderIdSet());
                stats1.setRefund_order_ct(stats1.getRefundOrderIdSet().size() + 0L);
                stats1.setRefund_amount(stats1.getRefund_amount().add(stats2.getRefund_amount()));

                stats1.getPaidOrderIdSet().addAll(stats2.getPaidOrderIdSet());
                stats1.setPaid_order_ct(stats1.getPaidOrderIdSet().size() + 0L);

                stats1.setComment_ct(stats1.getComment_ct() + stats2.getComment_ct());
                stats1.setGood_comment_ct(stats1.getGood_comment_ct() + stats2.getGood_comment_ct());

                return stats1;
            }
        },
        new ProcessWindowFunction<ProductStats, ProductStats, Long, TimeWindow>() {
            @Override
            public void process(Long aLong, Context context, Iterable<ProductStats> elements, Collector<ProductStats> out) throws Exception {
                for (ProductStats productStats : elements) {
                    productStats.setStt(DateTimeUtil.toYMDHMS(new Date(context.window().getStart())));
                    productStats.setEdt(DateTimeUtil.toYMDHMS(new Date(context.window().getEnd())));
                    productStats.setTs(new Date().getTime());
                    out.collect(productStats);
                }
            }
        }
);

5 补充商品维度信息

因为除了下单操作之外,其它操作,只获取到了商品的id,其它维度信息是没有的。

(1)关联商品维度

SingleOutputStreamOperator<ProductStats> productStatsWithSkuDS = AsyncDataStream.unorderedWait(
        reduceDS,
        new DimAsyncFunction<ProductStats>("DIM_SKU_INFO") {

            @Override
            public void join(ProductStats productStats, JSONObject dimJsonObj) throws Exception {
                productStats.setSku_name(dimJsonObj.getString("SKU_NAME"));
                productStats.setSku_price(dimJsonObj.getBigDecimal("PRICE"));
                productStats.setCategory3_id(dimJsonObj.getLong("CATEGORY3_ID"));
                productStats.setSpu_id(dimJsonObj.getLong("SPU_ID"));
                productStats.setTm_id(dimJsonObj.getLong("TM_ID"));
            }

            @Override
            public String getKey(ProductStats productStats) {
                return productStats.getSku_id().toString();
            }
        },
        60, TimeUnit.SECONDS
);

(2)关联SPU维度

SingleOutputStreamOperator<ProductStats> productStatsWithSpuDS =
        AsyncDataStream.unorderedWait(productStatsWithSkuDS,
                new DimAsyncFunction<ProductStats>("DIM_SPU_INFO") {
                    @Override
                    public void join(ProductStats productStats, JSONObject jsonObject) throws Exception {
                        productStats.setSpu_name(jsonObject.getString("SPU_NAME"));
                    }
                    @Override
                    public String getKey(ProductStats productStats) {
                        return String.valueOf(productStats.getSpu_id());
                    }
                }, 60, TimeUnit.SECONDS
        );

(3)关联品类维度

SingleOutputStreamOperator<ProductStats> productStatsWithCategory3DS =
        AsyncDataStream.unorderedWait(productStatsWithSpuDS,
                new DimAsyncFunction<ProductStats>("DIM_BASE_CATEGORY3") {
                    @Override
                    public void join(ProductStats productStats, JSONObject jsonObject) throws Exception {
                        productStats.setCategory3_name(jsonObject.getString("NAME"));
                    }
                    @Override
                    public String getKey(ProductStats productStats) {
                        return String.valueOf(productStats.getCategory3_id());
                    }
                }, 60, TimeUnit.SECONDS
        );

(4)关联品牌维度

SingleOutputStreamOperator<ProductStats> productStatsWithTmDS =
        AsyncDataStream.unorderedWait(productStatsWithCategory3DS,
                new DimAsyncFunction<ProductStats>("DIM_BASE_TRADEMARK") {
                    @Override
                    public void join(ProductStats productStats, JSONObject jsonObject) throws Exception {
                        productStats.setTm_name(jsonObject.getString("TM_NAME"));
                    }
                    @Override
                    public String getKey(ProductStats productStats) {
                        return String.valueOf(productStats.getTm_id());
                    }
                }, 60, TimeUnit.SECONDS
        );

productStatsWithTmDS.print(">>>");

(5)测试

  • 运行rt_applog目录下的jar包。

在这里插入图片描述

  • 运行rt_dblog目录下的jar包,执行两次以改变水位线,触发窗口提交操作。

在这里插入图片描述

6 写入ClickHouse

(1)在ClickHouse中创建商品主题宽表

create table product_stats_2022 (
   stt DateTime,
   edt DateTime,
   sku_id  UInt64,
   sku_name String,
   sku_price Decimal64(2),
   spu_id UInt64,
   spu_name String ,
   tm_id UInt64,
   tm_name String,
   category3_id UInt64,
   category3_name String ,
   display_ct UInt64,
   click_ct UInt64,
   favor_ct UInt64,
   cart_ct UInt64,
   order_sku_num UInt64,
   order_amount Decimal64(2),
   order_ct UInt64 ,
   payment_amount Decimal64(2),
   paid_order_ct UInt64,
   refund_order_ct UInt64,
   refund_amount Decimal64(2),
   comment_ct UInt64,
   good_comment_ct UInt64 ,
   ts UInt64
)engine =ReplacingMergeTree( ts)
        partition by  toYYYYMMDD(stt)
        order by   (stt,edt,sku_id );

(2)为主程序增加写入ClickHouse的Sink

// TODO 11 将结果写入到ClickHouse
productStatsWithTmDS.addSink(
        ClickhouseUtil.getJdbcSink(
                "insert into product_stats_2022 values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)")
);

(3)整体测试

  • 启动ZK、Kafka、logger.sh、ClickHouse、Redis、HDFS、Hbase、Maxwell
  • 运行BaseLogApp
  • 运行BaseDBApp
  • 运行OrderWideApp
  • 运行PaymentWideApp
  • 运行ProductsStatsApp
  • 运行rt_applog目录下的jar包
  • 运行rt_dblog目录下的jar包
  • 查看控制台输出
  • 查看ClickHouse中products_stats_2022表数据

注意:一定要匹配两个数据生成模拟器的日期,否则窗口无法匹配上。

二 DWS层-地区主题表(FlinkSQL)

统计主题需求指标输出方式计算来源来源层级
地区pv多维分析page_log直接可求dwd
uv多维分析需要用page_log过滤去重dwm
下单(单数,金额)可视化大屏订单宽表dwm

地区主题主要是反映各个地区的销售情况。从业务逻辑上地区主题比起商品更加简单,业务逻辑也没有什么特别的就是做一次轻度聚合然后保存,所以使用flinkSQL,来完成该业务。

1 需求分析与思路

  • 定义Table流环境
  • 把数据源定义为动态表
  • 通过SQL查询出结果表
  • 把结果表转换为数据流
  • 把数据流写入目标数据库

如果是Flink官方支持的数据库,也可以直接把目标数据表定义为动态表,用insert into 写入。由于ClickHouse目前官方没有支持的jdbc连接器(目前支持Mysql、 PostgreSQL、Derby)。也可以制作自定义sink,实现官方不支持的连接器。但是比较繁琐。

2 在pom.xml文件中添加FlinkSQL相关依赖

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-table-api-java-bridge_${scala.version}</artifactId>
    <version>${flink.version}</version>
</dependency>

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-table-planner-blink_${scala.version}</artifactId>
    <version>${flink.version}</version>
</dependency>

3 创建ProvinceStatsSqlApp,定义Table流环境

package com.hzy.gmall.realtime.app.dws;
/**
 * 地区主题统计 -- SQL
 */
public class ProvinceStatsSqlApp {
    public static void main(String[] args) throws Exception {
        // TODO 1 环境准备
        // 1.1 流处理环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // 1.2 表执行环境
        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
        // 1.3 设置并行度
        env.setParallelism(4);

        // TODO 2 检查点相关设置(略)

        env.execute();
    }
}

4 MyKafkaUtil增加一个DDL的方法

public static String getKafkaDDL(String topic,String groupId){
    String ddl = "'connector' = 'kafka'," +
            "  'topic' = '"+topic+"'," +
            "  'properties.bootstrap.servers' = '"+KAFKA_SERVER+"'," +
            "  'properties.group.id' = '"+groupId+"'," +
            "  'scan.startup.mode' = 'latest-offset'," +
            "  'format' = 'json'";
    return ddl;
}

5 把数据源定义为动态表并指定水位线

在这里插入图片描述

(1)指定WATERMARK

WATERMARK 定义了表的事件时间属性,其形式为 WATERMARK FOR rowtime_column_name AS watermark_strategy_expression

rowtime_column_name 把一个现有的列定义为一个为表标记事件时间的属性。该列的类型必须为 TIMESTAMP(3),且是 schema 中的顶层列,它也可以是一个计算列。相当于是API格式中的提取时间字段操作。

watermark_strategy_expression 定义了 watermark 的生成策略。它允许使用包括计算列在内的任意非查询表达式来计算 watermark ;表达式的返回类型必须是 TIMESTAMP(3),表示了从 Epoch 以来的经过的时间。 返回的 watermark 只有当其不为空且其值大于之前发出的本地 watermark 时才会被发出(以保证 watermark 递增)。每条记录的 watermark 生成表达式计算都会由框架完成。 框架会定期发出所生成的最大的 watermark ,如果当前 watermark 仍然与前一个 watermark 相同、为空、或返回的 watermark 的值小于最后一个发出的 watermark ,则新的 watermark 不会被发出。 Watermark 根据 pipeline.auto-watermark-interval 中所配置的间隔发出。 若 watermark 的间隔是 0ms ,那么每条记录都会产生一个 watermark,且 watermark 会在不为空并大于上一个发出的 watermark 时发出。

使用事件时间语义时,表必须包含事件时间属性和 watermark 策略。

Flink 提供了几种常用的 watermark 策略。

  • 严格递增时间戳: WATERMARK FOR rowtime_column AS rowtime_column

    发出到目前为止已观察到的最大时间戳的 watermark ,时间戳大于最大时间戳的行被认为没有迟到。

  • 递增时间戳: WATERMARK FOR rowtime_column AS rowtime_column - INTERVAL '0.001' SECOND

    发出到目前为止已观察到的最大时间戳减 1 的 watermark ,时间戳大于或等于最大时间戳的行被认为没有迟到。相当于是API格式中的单调递增策略。

  • 有界乱序时间戳: WATERMARK FOR rowtime_column AS rowtime_column - INTERVAL 'string' timeUnit

    发出到目前为止已观察到的最大时间戳减去指定延迟的 watermark ,例如, WATERMARK FOR rowtime_column AS rowtime_column - INTERVAL '5' SECOND 是一个 5 秒延迟的 watermark 策略。

其中WATERMARK FOR rowtime AS rowtime是把某个字段设定为EVENT_TIME。

详细说明。

(2)系统内置函数

将字符串转换为时间戳。

TO_TIMESTAMP(string1[, string2])Converts date time string string1 with format string2 (by default: ‘yyyy-MM-dd HH:mm:ss’) under the session time zone (specified by TableConfig) to a timestamp.Only supported in blink planner.

详细说明。

(3)给计算列起别名

<computed_column_definition>:
  column_name AS computed_column_expression [COMMENT column_comment]

(4)完整代码

字段名要和kafka中的json属性完全一致。

// TODO 3 从指定的数据源(kafka)读取数据,转换为动态表,并指定水位线
String orderWideTopic = "dwm_order_wide";
String groupId = "province_stats";
tableEnv.executeSql("CREATE TABLE order_wide (" +
        " province_id BIGINT," +
        " province_name STRING," +
        " province_area_code STRING," +
        " province_iso_code STRING," +
        " province_3166_2_code STRING," +
        " order_id STRING," +
        " split_total_amount DOUBLE," +
        " create_time STRING," +
        " rowtime as TO_TIMESTAMP(create_time)," +
        " WATERMARK FOR rowtime AS rowtime - INTERVAL '3' SECOND" +
        " ) WITH (" + MyKafkaUtil.getKafkaDDL(orderWideTopic,groupId) +")");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112880.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

216. 组合总和 III

216. 组合总和 III 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输…

3.2 Static Terrestrial Laser Scanners 静态地基激光扫描仪

本章节介绍的静态地基激光扫描系统指的是那些在一个固定位置的位置上对周边场景地物特征进行扫描的设备。该类型设备的扫描测量机制是&#xff0c;通过激光测距仪进行斜距测量&#xff0c;与此同时通过水平和竖直两个方向上同步运动的角度编码器来记录角度变化值&#xff08;如…

编译原理——正规式、NFA构造DFA

一、DFA和NFA的区别 NFA&#xff1a;非确定有限自动机 DFA&#xff1a;确定有限自动机 NFA在同一状态&#xff0c;可以有多条出边&#xff0c;DFA在同一状态&#xff0c;只能有一条出边&#xff1b; NFA的初态可以具有多个&#xff0c;DFA的初态是唯一的&#xff1b; 比如这个…

数据结构入门——栈和队列详解

栈和队列详解1 栈1.1 栈的概念及结构1.2 栈的实现1.3 支持动态增长的栈1.3.1 结构声明1.3.2 栈的初始化和销毁1.3.3 入栈和出栈操作1.3.4 栈的判空和元素个数2 队列2.1 队列的概念及结构2.2 队列的实现2.3 链表实现队列2.3.1 结构声明2.3.2 队列的初始化和销毁2.3.3 队列入队和…

【工作流Activiti7】4、Activiti7 结束/终止流程

1. 结束/终止 正在运行的流程实例 思路&#xff1a;跟回退一样的思路一样&#xff0c;直接从当前节点跳到结束节点&#xff08;EndEvent&#xff09; /*** 结束任务* param taskId 当前任务ID*/ public void endTask(String taskId) {// 当前任务Task task taskService…

Tomcat学习

文章目录1、Tomcat是什么&#xff1f;2、Tomcat安装部署java环境部署tomcat目录结构介绍webapps目录bin目录tomcat启停方式3、Tomcat配置文件tomcat-users.xmlserver.xml结构组件详情配置文件注释4、Tomcat端口5、JVM调优6、Tomcat启动慢解决7、Tomcat面试题目1.Tomcat的默认端…

npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

一、问题描述 首次用vscode运行vue项目时&#xff0c;报错&#xff1a; npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 二、解决 我的解决过程&#xff1a;检查是否安装node.js环境 已安装node 这样一来&#xff0c;真不知道怎么回事了。环境也没有…

五、Arduino IDE开发esp8266环境搭建

1、安装驱动程序 (1)安装USB转串口驱动程序。 (2)根据板载的USB转串口驱动芯片选择合适驱动安装。USB转串口芯片负责和电脑之间进行数据通信。 (3)常见USB转串口驱动 CP210x驱动:CP210x USB 至 UART 桥 VCP 驱动器 - 芯科科技 CH340驱动 2、Arduino IDE环境搭建 要想使用Ar…

数据结构与算法java实战篇--高级排序

目录 一.希尔排序 二.划分 三.快速排序 1. 快速排序的算法 2.选择枢纽 一.希尔排序 希尔排序是基于插入排序的算法来实现的&#xff0c;不同的是希尔排序是采用n-增量来实现排序&#xff0c;如下是希尔排序的图解&#xff1a; 希尔排序会先以n个增量对元素进行划分&#xf…

原神私服 grasscutter搭建及食用教程 v3.3

本教程搭建过程食用vmware虚拟机服务端搭建过程及其简单。照着教程操作即可。本次对应的版本是3.3的版本&#xff0c;后期会持续更新。 一.资源下载准备&#xff1a; 1.vmwera16虚拟机下载安装自己百度吧&#xff0c;非常简单。一路next安装完后再输入一个百度来的秘钥即可。…

【kafka】学习笔记(二)

学习笔记五、Kafka Broker5.1、在zookeeper的服务端存储的Kafka相关信息5.2、Kafka Broker 总体工作流程5.3、Kafka Broker 节点服役和退役5.3.1、节点服役5.3.2、节点退役5.4、Kafka Broker 副本5.4.1、副本信息5.4.3、Leader 选举流程5.4.3、 Leader 和 Follower 故障处理细节…

【OpenCV-Python】教程:7-6 SVM识别手写字符

OpenCV Python SVM 识别手写字符 【目标】 用 SVM 识别手写字符 【代码】 在kNN中&#xff0c;直接用的是像素亮度值&#xff0c;这次&#xff0c;我们将使用 Histogram of Oriented Gradients (HOG) 作为特征向量 import cv2 import numpy as npSZ 20 bin_n 16 # Numbe…

Python pandas有几千个库函数,你用过几个?(5)

上一篇链接&#xff1a; Python pandas有几千个库函数&#xff0c;你用过几个&#xff1f;&#xff08;4&#xff09;_Hann Yang的博客-CSDN博客 12个pandas子模块又包含310个库函数&#xff08;含类、方法、子模块&#xff09;&#xff1a; import pandas as pd funcs [_ …

【C与数据结构】——寒假提高每日练习Day1

一共16日的练习&#xff0c;分为选择题与编程题&#xff0c;涵盖了C语言所学以及数据结构的重点&#xff0c;以及一些秋招、春招面试的高频考点&#xff0c;难度会随着天数而上升。 &#xff08;建议在电脑客户端进行&#xff0c;将鼠标选中被遮挡的地方&#xff0c;即可看到解…

aws codepipeline创建跨账户的cicd

参考资料 Building a Cross-account CI/CD Pipeline Create a pipeline in CodePipeline that uses resources from another AWS account 通常来说&#xff0c;我们会将代码和pipeline配置不同的账户中&#xff0c;在codepipeline的source阶段指定为另一个账号的codecommit仓…

将扩散模型应用到文本领域

前言 扩散模型在文生图领域可谓是大显身手&#xff0c;效果棒棒&#xff5e; 每当一个idea有效之时&#xff0c;便会有更多相关的研究跟进尝试&#xff0c;今天就给大家介绍一篇将扩散模型应用到文本生成领域的工作&#xff0c;这也是一篇比较新的paper&#xff0c;其中还用到了…

LCS+LIS最长公共上升子序列

LIS LCS AcWing 272. 最长公共上升子序列 没优化的代码 优化解释在代码注释中优化解释在代码注释中优化解释在代码注释中 #include<iostream> #include<cstring> #include<algorithm>using namespace std;const int N 3e3 10;int a[N], b[N], f[N][N];i…

开启浏览器sourcemap调试生产环境代码

开启浏览器sourcemap调试生产环境代码 Source Map介绍 在做网站性能优化的时候&#xff0c;我们经常会做js和css代码压缩。但是压缩之 后的代码在调试的时候就会异常困难。source map就是解决问题的一种解决方案 浏览器Source Map 浏览器可以设置开启或者关闭SourceMap&…

78. 子集

78. 子集 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2]…

14【SpringMVC的拦截器】

文章目录一、拦截器1.1 拦截器与过滤器1.2 拦截器的应用1.2.1 HandlerInterceptor接口1.2.2 拦截器的拦截规则1.3 搭建工程测试拦截器1.3.1 测试SpringMVC拦截器1.3.2 SprinMVC拦截器注意事项1.4 HandlerMethod类1.5 多个拦截器的执行顺序一、拦截器 1.1 拦截器与过滤器 过滤…