1.1 设计思路
之前数据分层处理,最后把轻度聚合的结果保存到ClickHouse中,主要的目的就是提供即时的数据查询、统计、分析服务。这些统计服务一般会用两种形式展现,一种是为专业的数据分析人员的BI工具,一种是面向非专业人员的更加直观的数据大屏。
以下主要是面向百度的sugar的数据大屏服务的接口开发。
1.2 需求梳理
1.2.1 最终显示效果图
1.2.2 分析可视化大屏
在可视化大屏中每个组件都需要一个单独的接口,图中一共涉及8个组件。
|
组件名称 |
组件 |
查询指标 |
对应的数据表 |
|
总成交金额 |
数字翻牌 |
订单总金额 |
product_stats |
|
省市热力图查询 |
热力图 |
省市分组订单金额 |
province_stats |
|
分时流量 |
折线图 |
UV分时数 PV分时数 新用户分时数 |
visitor_stats |
|
品牌TopN |
水平柱状图 |
按品牌分组订单金额 |
product_stats |
|
品类分布 |
饼状图 |
按品类分组订单金额 |
product_stats |
|
热词字符云 |
字符云 |
关键词分组计数 |
keyword_stats |
|
流量表格 |
交叉透视表 |
UV数(新老用户) PV数(新老用户) 跳出率(新老用户) 平均访问时长 (新老用户) 平均访问页面数(新老用户) |
visitor_stats |
|
热门商品 |
轮播表格 |
按SPU分组订单金额 |
product_stats |
1.2.3 接口执行过程
之前我们实现了DWS层计算后写入到ClickHouse中,接下来就是要为可视化大屏服务,提供一个数据接口用来查询ClickHouse中的数据。这里主要有两项工作
1)配置可视化大屏服务
2)编写数据查询接口以供可视化大屏进行访问
第 2 章 sugar数据大屏
2.1 产品介绍
Sugar是百度云推出的敏捷 BI 和数据可视化平台,目标是解决报表和大屏的数据 BI 分析和可视化问题,解放数据可视化系统的开发人力。
2.2 使用入口
地址如下:https://cloud.baidu.com/product/sugar.html
2.3 创建数据大屏
1)点击立即使用, 登录百度账号
2)首次使用需要实名认证, 然后有30天的免费使用期限
3)会看到一个免费试用版的组织
4)进入试用版组织
5)选择第一个空间
6)创建数据大屏
7)选择空模板或者根据现有模板进行修改,我们这里选择空白模板,并指定大屏的名称
8)点击确定后会进入大屏编辑页面
第 3 章 总成交金额接口
3.1 Sugar组件: 数字翻牌器
成交金额是个数字, 使用数字翻牌器比较合适
3.1.1 添加数字翻牌器组件
3.1.2 配置数字翻牌器组件
数据绑定方式选择api拉取. 所以我们需要开发接口来提供数据
这个就是sugar会周期性访问的数据接口地址,可以自定义,其中$CUR_HOST是个全局变量,需要在空间中配置(后面再说)
3.1.3 查询组件需要的数据格式
在数据绑定的位置选择【静态JSON】,可以看到数据需要的JSON格式
3.1.4 接口访问路径以及返回格式
1)路径:/api/sugar/gmv
2)返回的数据格式
{ "status": 0, "msg": "", "data": 1201070.6983345444 }
3.2 数据接口实现
使用Sprintboot来实现接口
3.2.1 创建springboot子模块
3.2.2 手动添加其他依赖
<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.2.6</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.75</version> </dependency>
3.2.3 代码结构分层
|
分层 |
类 |
处理内容 |
|
controller 控制层 |
SugarController |
查询交易额接口及返回参数处理 |
|
service 服务层 |
ProductStatsService ProductStatsServiceImpl |
查询商品统计数据 |
|
mapper 数据映射层 |
ProductStatsMapper |
编写SQL查询商品统计表 |
3.2.4 springboot配置
在application.properties内添加如下配置:
server.port=8070
#配置ClickHouse驱动以及URL
spring.datasource.driver-class-name=ru.yandex.clickhouse.ClickHouseDriver
spring.datasource.url=jdbc:clickhouse://hadoop164:8123/flinkdb
3.2.5 创建需要的包结构
3.2.6 在应用入口添加扫描包
package com.yuange.flinkpublisher; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication // 填入mapper包的全路径 @MapperScan(basePackages = "com.yuange.flinkpublisher.mapper") public class FlinkPublisherApplication { public static void main(String[] args) { SpringApplication.run(FlinkPublisherApplication.class, args); } }
3.2.7 Mapper层
在mapper包下创建接口:ProductStatsMapper
package com.yuange.flinkpublisher.mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.math.BigDecimal; /** * @作者:袁哥 * @时间:2021/8/9 19:34 */ public interface ProductStatsMapper { //计算当天或者指定日志总的销售额 @Select("select sum(order_amount)\n" + "from product_stats_2021\n" + "where toYYYYMMDD(stt) = #{date}") BigDecimal getGMV(@Param("date") int date); }
3.2.8 Service层
1)创建接口
package com.yuange.flinkpublisher.service; import java.math.BigDecimal; /** * @作者:袁哥 * @时间:2021/8/9 19:33 */ public interface ProductStatsService { BigDecimal getGMV(int date); }
2)实现接口
package com.yuange.flinkpublisher.service; import com.yuange.flinkpublisher.mapper.ProductStatsMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; /** * @作者:袁哥 * @时间:2021/8/9 19:33 */ @Service public class ProductStatsServiceImpl implements ProductStatsService { @Autowired ProductStatsMapper productStatsMapper; @Override public BigDecimal getGMV(int date) { return productStatsMapper.getGMV(date); } }
3.2.9 Controller层
该类主要接收用户请求,并做出相应。根据sugar不同的组件,返回不同的格式
package com.yuange.flinkpublisher.controller; import com.alibaba.fastjson.JSONObject; import com.yuange.flinkpublisher.service.ProductStatsService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.Date; /** * @作者:袁哥 * @时间:2021/8/9 19:33 */ @RestController public class SugarController { @Autowired ProductStatsService productStatsService; @RequestMapping("/sugar/api/gmv") public String gmv(@RequestParam(value = "date",defaultValue = "0") int date){ if (date == 0){ date = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date())); } BigDecimal gmv = productStatsService.getGMV(date); JSONObject result = new JSONObject(); result.put("status",0); result.put("msg",""); result.put("data",gmv); return result.toJSONString(); } }
3.2.10 本地测试
1)启动web应用
2)在浏览器输入地址:http://localhost:8070/sugar/api/gmv?date=20210809
3)返回值
3.3 内网穿透
前面定义的接口, 只能在局域网使用, sugar是没有办法直接读到这个接口, 只有让接口有公网地址才行,生产阶段可以直接把服务器部署在云上就行了, 自然就有了公网地址,在学习阶段可以使用工具实现内网穿透来解决这个问题
3.3.1 内网穿透的作用
通常个人电脑无论是连接WIFI上网还是用网线上网,都是属于局域网里边的,外网无法直接访问到你的电脑,内网穿透可以让你的局域网中的电脑实现被外网访问功能。
3.3.2 现有工具
目前国内网穿透工具很多,常见的比如花生壳、Ngrok、网云穿等。
Ngrok: http://www.ngrok.cc
网云穿:http://www.neiwangchuantou.net/ ,本文以介绍网云穿为主
3.3.3 配置步骤
1)注册网云穿
2)登录之后到个人版领取免费隧道并进行配置
3)下载客户端, 解压, 直接打开
3.3.4 使用外网地址访问
3.4 配置sugar大屏
3.4.1 配置服务器全局Host
进入空间管理
3.4.2 大屏刷新数据
回到大屏配置
第 4 章 商品交易额不同维度统计
4.1 从三个维度统计商品交易额
1)品牌维度 做柱状图
2)品类 饼形图
3)商品spu 轮播图
这三个的共同特征是可以根据商品统计信息计算出来。
4.2 sugar组件设置
4.2.1 横向柱图(品牌)
1)添加横向柱状图
2)查看数据格式
{ "status": 0, "msg": "", "data": { "categories": [ "苹果", "三星", "华为", "oppo", "vivo", "小米99" ], "series": [ { "name": "手机品牌", "data": [ 5295, 7213, 8346, 5473, 9197, 9919 ] } ] } }
3)修改数据绑定方式
$API_HOST/sugar/api/gmv/tm?date=20210809&limit=10
4)修改排序规则
4.2.2 轮播饼图(品类)
1)添加轮播饼图
2)查看数据格式
{ "status": 0, "msg": "", "data": [ { "name": "PC", "value": 97, "url": "http://www.baidu.com" }, { "name": "iOS", "value": 50, "url": "http://www.baidu.com" }, { "name": "Android", "value": 59, "url": "http://www.baidu.com" }, { "name": "windows phone", "value": 29 }, { "name": "Black berry", "value": 3 }, { "name": "Nokia S60", "value": 2 }, { "name": "Nokia S90", "value": 1 } ] }
3)修改数据绑定方式
$API_HOST/sugar/api/gmv/c3?date=20210809
4.2.3 轮播表格(spu)
1)添加轮播表格
2)查看数据格式
{ "status": 0, "msg": "", "data": { "columns": [ { "name": "分组织", "id": "subsys" }, { "name": "部门", "id": "module" }, { "name": "业务组", "id": "business" }, { "name": "姓名", "id": "name" }, { "name": "销售额", "id": "value", "accuracy": 2 } ], "rows": [ { "subsys": "北京总部", "module": "市场部", "business": "第一小分队", "name": "张三", "value": 6672389, "url": "http://www.baidu.com" }, { "subsys": "北京总部", "module": "市场部", "business": "第一小分队", "name": "李四", "value": 7673456.78, "value_level": "green", "url": "http://www.baidu.com" }, { "subsys": "北京总部", "module": "市场二部", "business": "第二小分队", "name": "百度", "__showx_row_level": "red", "value": "<a href=\"http://www.baidu.com\" target=\"_blank\">百度链接</a>", "value_ishtml": true, "url": "http://www.baidu.com" }, { "subsys": "上海分部", "module": "销售部", "business": "第三小分队", "name": "张伟", "value": 8967569, "url": "http://www.baidu.com" }, { "subsys": "上海分部", "module": "销售部", "business": "第三小分队", "name": "李静", "value": 5645657, "url": "http://www.baidu.com" }, { "subsys": "上海分部", "module": "销售部", "business": "第三小分队", "name": "完颜付", "value": 4999889, "url": "http://www.baidu.com" }, { "subsys": "上海分部", "module": "销售部", "business": "第三小分队", "name": "纳兰德", "value": 8878765, "url": "http://www.baidu.com" }, { "subsys": "上海分部", "module": "销售二部", "business": "突击小队", "name": "迪乌夫", "value": 7609878, "url": "http://www.baidu.com" }, { "subsys": "上海分部", "module": "销售二部", "business": "突击小队", "name": "南宫强", "value": 6786546, "url": "http://www.baidu.com" }, { "subsys": "上海分部", "module": "销售二部", "business": "突击小队", "name": "萨珊珊", "value": 3909786, "url": "http://www.baidu.com" }, { "subsys": "上海分部", "module": "销售二部", "business": "王牌小组", "value_background": "#93dcf3", "name": "占志林", "value": 10735687, "url": "http://www.baidu.com" }, { "subsys": "上海分部", "module": "销售二部", "business": "王牌小组", "name": "欧阳菲", "value": 8767544, "url": "http://www.baidu.com" }, { "subsys": "上海分部", "module": "销售二部", "business": "王牌小组", "name": "令狐光", "value": 7867455, "url": "http://www.baidu.com" } ] } }