【实时数仓】DWS层之关键词主题表(FlinkSQL)、数据可视化接口、Sugar数据大屏、总成交金额接口实现

news2024/12/23 15:22:25

文章目录

  • 一 DWS层-关键词主题表(FlinkSQL)
    • 1 过滤数据
    • 2 利用UDTF进行拆分
      • (1)拆分结果
      • (2)Join 表函数 (UDTF)
      • (3)代码
    • 3 分组、开窗、聚合计算
    • 4 转换为流并写入ClickHouse
      • (1)在ClickHouse中创建关键词统计表
      • (2)封装KeywordStats实体类
      • (3)在主程序中转换流并写入ClickHouse
    • 5 整体测试
  • 二 数据可视化接口
    • 1 设计思路
    • 2 需求梳理
      • (1)效果图
      • (2)分析可视化大屏
      • (3)接口执行过程
  • 三 Sugar数据大屏
    • 1 产品介绍
    • 2 使用入口
    • 3 创建数据大屏
  • 四 总成交金额接口
    • 1 Sugar组件:数字翻牌器
      • (1)添加组件
      • (3)查询组件需要的数据格式
      • (4)接口访问路径以及返回格式
      • 1.1.4 接口访问路径以及返回格式
      • (5)执行SQL
        • a product_stats_2022表中数据
        • b product_stats_2022表结构
        • c SQL语句
    • 2 数据接口实现
      • (1)创建数据接口模块
        • a 在gmall2022-parent项目下创建新的SpringBoot模块gmall2022-publisher
        • b 在pom.xml文件中添加需要的依赖
      • (2)代码分层结构
        • a 代码结构
        • b 修改Springboot核心配置文件 application.properties
        • c 创建包结构
      • (3)代码分层实现
        • a Mapper层:创建ProductStatsMapper接口
        • b 在Application中添加@MapperScan的注解
        • c Service层:创建ProductStatsService接口
        • d Service层:创建ProductStatsServiceImpl实现类
        • e Controller层:创建SugarController类
      • (4)测试本地接口
        • a 启动SpringBoot应用程序
        • b 输出结果

一 DWS层-关键词主题表(FlinkSQL)

1 过滤数据

// TODO 4 将动态表中表示搜索行为的记录过滤出来
Table fullwordTable = tableEnv.sqlQuery("select " +
        "  page['item'] fullword,rowtime " +
        " from " +
        "  page_view " +
        " where " +
        "  page['page_id']='good_list' and page['item'] is not null");

2 利用UDTF进行拆分

(1)拆分结果

搜索内容:荣耀Play6T Pro 天玑810
	fullword				rowtime
荣耀Play6T Pro 天玑810		20221215

拆分后的效果:荣耀  Play6T  Pro  天玑  810
     keyword		   rowtime
	  荣耀			20221215
	  Play6T		  20221215
	  Pro			  20221215
	  天玑			20221215
	  810  		      20221215

(2)Join 表函数 (UDTF)

将表与表函数的结果进行 join 操作。左表(outer)中的每一行将会与调用表函数所产生的所有结果中相关联行进行 join 。

用户自定义表函数( User-defined table functions,UDTFs ) 在执行前必须先注册。请参考 UDF 文档 以获取更多关于指定和注册UDF的信息

(3)代码

// TODO 2 注册自定义UDTF函数
tableEnv.createTemporarySystemFunction("ik_analyze", KeywordUDTF.class);

// TODO 5 使用自定义UDTF函数对搜索关键词进行拆分
Table keywordTable = tableEnv.sqlQuery("SELECT rowtime, keyword FROM "+ fullwordTable +", LATERAL TABLE(ik_analyze(fullword)) AS T(keyword)");

3 分组、开窗、聚合计算

// TODO 6 分组、开窗、聚合计算
Table resTable = tableEnv.sqlQuery("select " +
        "  DATE_FORMAT(TUMBLE_START(rowtime, INTERVAL '10' SECOND),'yyyy-MM-dd HH:mm:ss') as stt, " +
        "  DATE_FORMAT(TUMBLE_END(rowtime, INTERVAL '10' SECOND),'yyyy-MM-dd HH:mm:ss') as edt, " +
        "  keyword, " +
        "  count(*) ct," +
        "  '"+ GmallConstant.KEYWORD_SEARCH +"' source," +
        "  UNIX_TIMESTAMP() * 1000 as ts" +
        " from " +
        "  "+ keywordTable +" " +
        " group by " +
        "  TUMBLE(rowtime, INTERVAL '10' SECOND),keyword ");

4 转换为流并写入ClickHouse

(1)在ClickHouse中创建关键词统计表

create table keyword_stats_2022 (
    stt DateTime,
    edt DateTime,
    keyword String ,
    source String ,
    ct UInt64 ,
    ts UInt64
)engine =ReplacingMergeTree( ts)
        partition by  toYYYYMMDD(stt)
        order by  ( stt,edt,keyword,source );

(2)封装KeywordStats实体类

package com.hzy.gmall.realtime.beans;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * Desc: 关键词统计实体类
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class KeywordStats {
    private String keyword;
    private Long ct;
    private String source;
    private String stt;
    private String edt;
    private Long ts;
}

(3)在主程序中转换流并写入ClickHouse

// TODO 7 将表转换为流
DataStream<KeywordStats> keywordStatsDS = tableEnv.toAppendStream(resTable, KeywordStats.class);
keywordStatsDS.print(">>>");

// TODO 8 将流中数据写入ck中
keywordStatsDS.addSink(ClickhouseUtil.getJdbcSink(
        // 字段顺序与实体类中属性顺序要一致
        "insert into keyword_stats_2022(keyword,ct,source,stt,edt,ts) values(?,?,?,?,?,?) "
));

5 整体测试

  • 启动ZK、Kafka、logger.sh、ClickHouse
  • 运行BaseLogApp
  • 运行KeywordStatsApp
  • 运行rt_applog目录下的jar包
  • 查看控制台输出
  • 查看ClickHouse中keyword_stats_2022表数据

二 数据可视化接口

1 设计思路

之前数据分层处理,最后把轻度聚合的结果保存到ClickHouse中,主要的目的就是提供即时的数据查询、统计、分析服务。这些统计服务一般会用两种形式展现,一种是为专业的数据分析人员的BI工具,一种是面向非专业人员的更加直观的数据大屏。

以下主要是面向百度的sugar的数据大屏服务的接口开发。

2 需求梳理

(1)效果图

在这里插入图片描述

(2)分析可视化大屏

在可视化大屏中每个组件都需要一个单独的接口,图中一共涉及8个组件。

组件名称组件查询指标对应的数据表
总成交金额数字翻牌订单总金额product_stats
省市热力图查询热力图省市分组订单金额province_stats
分时流量折线图UV分时数 PV分时数 新用户分时数visitor_stats
品牌TopN水平柱状图按品牌分组订单金额product_stats
品类分布饼状图按品类分组订单金额product_stats
热词字符云字符云关键词分组计数keyword_stats
流量表格交叉透视表UV数(新老用户) PV数(新老用户) 跳出率(新老用户) 平均访问时长 (新老用户) 平均访问页面数(新老用户)visitor_stats
热门商品轮播表格按SPU分组订单金额product_stats

(3)接口执行过程

在这里插入图片描述

之前实现了DWS层计算后写入到ClickHouse中,接下来就是要为可视化大屏服务,提供一个数据接口用来查询ClickHouse中的数据。这里主要有两项工作

  • 配置可视化大屏服务。
  • 编写数据查询接口以供可视化大屏进行访问。

三 Sugar数据大屏

1 产品介绍

Sugar是百度云推出的敏捷 BI 和数据可视化平台,目标是解决报表和大屏的数据 BI 分析和可视化问题,解放数据可视化系统的开发人力。

2 使用入口

https://cloud.baidu.com/product/sugar.html

3 创建数据大屏

  • 点击【立即使用】后,登录百度账号

  • 首先创建组织

  • 创建中选择产品【大屏尝鲜版】,首次使用有一个月的试用期

  • 新建好组织后选择【进入组织】

在这里插入图片描述

  • 然后进入默认的【第一个空间】

  • 在空间中选择【待创建大屏】后的【新建】

在这里插入图片描述

  • 选择大屏的模板

  • 可以选空模板,也可以根据现有的模板进行修改

(8) 可以选空模板,也可以根据现有的模板进行修改

  • 这里选择空白模板,并指定大屏的名称

在这里插入图片描述

  • 进入大屏的编辑窗口

四 总成交金额接口

1 Sugar组件:数字翻牌器

(1)添加组件

从大屏的编辑器上方选择【指标】→【数字翻牌器】

在这里插入图片描述

(3)查询组件需要的数据格式

在数据绑定的位置选择【静态JSON】,可以看到数据需要的JSON格式

(4)接口访问路径以及返回格式

1.1.4 接口访问路径以及返回格式

  • 访问路径:/api/sugar/gmv
  • 返回格式
{
  "status": 0,
  "data": 1201012.694507823
}

(5)执行SQL

a product_stats_2022表中数据

在这里插入图片描述

b product_stats_2022表结构

在这里插入图片描述

c SQL语句

toYYYYMMDD:将Date或DateTime转换为包含年份和月份编号的UInt32类型的数字(YYYY * 10000 + MM * 100 + DD)。

select sum(order_amount) order_amount from product_stats_2022 where toYYYYMMDD(stt)=20221215;

2 数据接口实现

(1)创建数据接口模块

a 在gmall2022-parent项目下创建新的SpringBoot模块gmall2022-publisher

在这里插入图片描述

可以先不选择依赖,之后统一在pom.xml中添加

b 在pom.xml文件中添加需要的依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.hzy.gmall.publisher</groupId>
    <artifactId>gmall2022-publisher</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gmall2022-publisher</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.11</version>
        </dependency>

        <dependency>
            <groupId>ru.yandex.clickhouse</groupId>
            <artifactId>clickhouse-jdbc</artifactId>
            <version>0.1.55</version>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

(2)代码分层结构

a 代码结构

分层处理内容
controller 控制层SugarController查询交易额接口及返回参数处理
service 服务层ProductStatsService ProductStatsServiceImpl查询商品统计数据
mapper 数据映射层ProductStatsMapper编写SQL查询商品统计表

b 修改Springboot核心配置文件 application.properties

server.port=8070
#配置ClickHouse驱动以及URL
spring.datasource.driver-class-name=ru.yandex.clickhouse.ClickHouseDriver
spring.datasource.url=jdbc:clickhouse://hadoop101:8123/default

c 创建包结构

在这里插入图片描述

(3)代码分层实现

a Mapper层:创建ProductStatsMapper接口

package com.hzy.gmall.publisher.mapper;
/**
 * 商品统计Mapper接口
 */
public interface ProductStatsMapper {
    // 获取某天商品的总交易额
    @Select("select sum(order_amount) order_amount from product_stats_2022 where toYYYYMMDD(stt)=#{date}")
    BigDecimal selectGMV(Integer date);
}

b 在Application中添加@MapperScan的注解

package com.hzy.gmall.publisher;

@SpringBootApplication
@MapperScan(basePackages = "com.hzy.gmall.publisher.mapper")
public class Gmall2022PublisherApplication {

    public static void main(String[] args) {
        SpringApplication.run(Gmall2022PublisherApplication.class, args);
    }

}

c Service层:创建ProductStatsService接口

package com.hzy.gmall.publisher.service;
/**
 * 商品统计service接口
 */
public interface ProductStatsService {
    // 获取某天的总交易额
    BigDecimal getGMV(Integer date);
}

d Service层:创建ProductStatsServiceImpl实现类

package com.hzy.gmall.publisher.service.impl;
/**
 * 商品统计service接口实现类
 */
@Service
public class ProductStatsServiceImpl implements ProductStatsService{

    @Autowired
    private ProductStatsMapper productStatsMapper;

    @Override
    public BigDecimal getGMV(Integer date) {
        return productStatsMapper.selectGMV(date);
    }
}

e Controller层:创建SugarController类

该类主要接收用户请求,并做出响应。根据sugar不同的组件,返回不同的格式。

package com.hzy.gmall.publisher.controller;
/**
 * 大屏展示控制层
 */
@RestController
@RequestMapping("/api/sugar")
public class SugarController {

    @Autowired
    private ProductStatsService productStatsService;

    @RequestMapping("/gmv")
    public String getGMV(@RequestParam(value = "date",defaultValue = "0") Integer date){
        if (date == 0){
            date = now();
        }

        // 调用service获取总交易额
        BigDecimal gmv = productStatsService.getGMV(date);

        String json = "{\"status\": 0,\"data\": "+gmv+"}";
        
        return json;
    }

    // 获取当前日期
    private Integer now() {
        String yyyyMMdd = DateFormatUtils.format(new Date(), "yyyyMMdd");
        return Integer.valueOf(yyyyMMdd);
    }
}

(4)测试本地接口

a 启动SpringBoot应用程序

用浏览器访问测试接口

b 输出结果

输出结果一:

在这里插入图片描述

输出结果二:

在这里插入图片描述

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

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

相关文章

大数据网站攻击实时项目架构

随着互联网的流行&#xff0c;网站安全问题就日益突出&#xff0c;但绝大多数的网站开发与建设公司只考虑正常用户的稳定使用&#xff0c;而对于网站安全方面了解甚少&#xff0c;发现网站安全存在问题和漏洞&#xff0c;其修补方式只能停留在页面代码的删除或者是恢复网站备份…

SpringBoot系列之SpringBoot启动流程详解

文章目录前言一、SpringBoot流程分析-初始化二、SpringBoot流程分析-run总结前言 SpringBoot的启动流程在我们面试的时候会经常被问&#xff0c;接下来我们根据源码来分析了解下SpringBoot是怎么启动的 一、SpringBoot流程分析-初始化 首先对SpringBoot主启动类进行debug&…

通用企业智能制造ERP源码 制造业通用ERP系统源码 工厂ERP源码C# web ASP.NET 源码

管理控制台 一&#xff0c;基础档案 客户档案、 供应商档案 、外协档案 、 物料档案、 产品档案 产品BOM 、 模具档案、 工价档案 、 人员档案 二&#xff0c;样品开发 产品开发 样品登记 产品开发&#xff1a;开发编号、设计来源、系列号、中英文设计名称、最后期限、…

Nginx由浅入深

一、Nginx简介 1、Nginx 概述 Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力确实在同类型的网页服务器中表现较好&#xff0c;中国大陆使用nginx网站用户有&#xff1a;百度、京东、新…

医院医疗信息管理系统源码 成熟EMR电子病历系统源码

医院医疗信息管理系统源码 成熟EMR电子病历系统源码 多家二甲医院在用&#xff0c;功能模块如下所示&#xff1a; 1.住院医生站 2.住院护士站 3.病案浏览工作站 4.质量控制工作站 5.系统维护工作站 开发环境 &#xff1a;VS2010 C# ORACLE 系统简介&#xff1a; 1各种记…

漏洞发现之操作系统

漏洞发现之操作系统1.系统漏洞1.1.系统漏洞介绍1.2.系统漏洞危害1.3.系统漏洞防范2.名词介绍2.1.CVSS2.2.CVE2.3.POC/EXP3.探针3.1.探针介绍3.2.探针工具介绍3.3.Goby3.3.1.Goby介绍3.3.2.下载地址3.3.3.Goby使用3.3.3.1.切换中英文3.3.3.2.建立扫描任务3.3.3.3.资产内容3.3.3.…

深入理解 FilterChainProxy【源码篇】

目录FilterChainProxy源码分析FilterChainProxy 源码-全局属性doFilter 方法doFilterInternal 方法VirtualFilterChain最后RequestRejectedHandler引用FilterChainProxy 在一个 Web 项目中&#xff0c;请求流程大概如下图所示&#xff1a; 请求从客户端发起&#xff08;例如浏…

TechG年度科技行业盛会来袭,深兰科技展台亮点抢先看!

2022年12月29日——31日&#xff0c;科技行业盛会「上海国际消费电子技术展(TechG)将在南京举办&#xff0c;深兰科技机器人产业集团将携人工智能机器人产品“家族”亮相展会&#xff0c;全面展示先进的人工智能机器人技术&#xff0c;呈现安全、高效、新潮的机器人应用场景。 …

D. Lucky Chains edu139 div2

Problem - D - Codeforces 题意是给你a和b&#xff0c;要求__gcd(ak,bk)1的k最多可以增加多少个1 分析&#xff1a; 遇到这种的最大公约数的问题&#xff0c;有很大概率都是推公式&#xff0c;以及使用筛法去把所有的质数筛出来利用质因子去缩短时间 这题就是一个推公式的题…

【UE4 第一人称射击游戏】11-武器跟随鼠标移动并添加开火音效

上一篇&#xff1a; 【UE4 第一人称射击游戏】10-添加冲刺功能 本篇效果&#xff1a; 步骤&#xff1a; 1.打开“SWAT_AnimBP”&#xff0c;添加3个“变换&#xff08;修改&#xff09;骨骼”节点 选中第一个“变换&#xff08;修改&#xff09;骨骼”节点&#xff0c;在细节…

JAVA——把一批压缩文件中存放的部分数据进行处理(替换)

JAVA——把一批压缩文件中存放的部分数据进行处理&#xff08;替换&#xff09;一、需求二、分析三、具体实现1.解压压缩文件2.读取解压后的文件并且按照一定逻辑处理3.把文件压缩存储4.方法的调用5.需要添加的依赖四、执行结果五、用到的工具类六、可以改进的地方1.文件处理完…

OpenText Exceed TurboX 客户案例——SMS 集团

SMS 集团通过 OpenText 提高工程师的工作效率。OpenText Exceed TurboX 帮助该制造商提高生产力和可靠性、降低成本并实现全球协作。 SMS集团存在的挑战 需要一个可以在全球范围内轻松访问的解决方案&#xff1b;需要一个系统&#xff0c;能够无缝运行图形要求苛刻的基于服务…

Git知识型整理

目的 了解Git&#xff0c; 以及工作原理&#xff0c; 能更好让自己解决在仓库中遇到的各种问题。 git 什么是git 分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。很多版本管理工具如&#xff1a;sourcetree, gitLab, tortoise等等&#…

贵金属软件MT4好不好用?MT4软件有什么优势特点?

如今的贵金属市场还是比较大的&#xff0c;有许多投资者都希望可以在里面赚一分钱&#xff0c;其实在市场变得很大的时候&#xff0c;我们更应该小心一点。因为如今市场当中能够选择的软件实在是太多了&#xff0c;我们可以查看一下哪一个软件比较适合投资&#xff0c;在挑选的…

1、初识C语言---“hello world”

文章目录1、什么是C语言呢?2、第一个C语言程序3、数据类型4、变量与常量4.1变量的定义方法4.2变量的命名规则4.3变量的使用4.4变量的作用域与生命周期4.5常量5.字符串转义字符注释5.1字符串5.2转义字符5.3注释1、什么是C语言呢? C语言是一门面向过程的、抽象化的通用程序设计…

Spring Boot学习篇(二)

Spring Boot学习篇(二) 1.spring boot中的拦截器 1.1 在com包.zlz包下面创建interceptor包,包的目录结构如下所示 1.2 在interceptor包下面创建MyInterceptor1和MyInterceptor2类(便于测试顺序) 1.2.1 MyInterceptor1类 package com.zlz.interceptor;import org.springfram…

集合家庭作业

Homework01 按要求实现: (1)封装一个新闻类&#xff0c;包含标题和内容属性&#xff0c;提供get、set方法,重写toString方法&#xff0c;打印对象时只打印标题; (2)只提供一个带参数的构造器&#xff0c;实例化对象时&#xff0c;只初始化标题;并且实例化两个对象: 新闻一:…

【C数组】详解数组

数组前言一、一维数组的创建和初始化&#xff08;一&#xff09;数组的创建1.数组的概念和创建方式2.变长数组&#xff08;二&#xff09;数组的初始化&#xff08;三&#xff09;一维数组的使用&#xff08;四&#xff09;一维数组在内存中的存储二、二维数组的创建和初始化&a…

rabbitmq基础7——队列和消息过期时间设置、死信队列、延迟队列、优先级队列、回调队列、惰性队列

文章目录一、过期时间1.1 针对队列设置1.2 针对消息设置二、死信队列2.1 死信交换器2.2 死信队列原理2.3 延迟队列&#xff08;特殊用法&#xff09;三、优先级队列3.1 监控页面创建优先级队列3.2 监控页面创建优先级消息四、回调队列4.1 RPC的定义4.2 PRC工作机制4.3 监控页面…

java本地socket服务端暴露至公网访问【内网穿透】

Java 服务端demo环境 jdk1.8 框架:springbootmaven 开发工具:IDEA 在pom文件引入第三包封装的netty框架maven坐标 <dependency><groupId>io.github.fzdwx</groupId><artifactId>sky-http-springboot-starter</artifactId><version>0.…