本文源码:GitHub·点这里 || GitEE·点这里java
数据可视化,是关于数据视觉表现形式的科学技术研究。其中,这种数据的视觉表现形式被定义为,一种以某种概要形式抽取出来的信息,包括相应信息单位的各类属性和变量。git
若是说的实际贴切的话:系统开发中常见的数据报表统计,将数据用图表或表格的形式呈现出来,帮助运营或者决策人员了解这些数据的规律或者价值,就是简单的可视化应用。github
从开发角度来看,把系统中的核心数据,用必定的手段进行统计,在借助一些精美的图表样式,展现出来,或者把一系列图表组装成一个数据大屏,格调十足。sql
可是从运营人员的角度看,更多的是借助可视化数据分析业务场景,获得有价值的参考数据,为后续的决策或者开展活动提供指导。因此随着业务线的不断发展,对数据分析的要求愈来愈高,也就诞生如今比较常见的BI分析工具和BI分析师。缓存
简单的步骤以下:基于业务需求,完成可视化数据处理(收集,规则,定时任务等)。借助经常使用的图表进行组合展现,可是也有一些注意事项以下:数据结构
柱状图架构
特色:通常展示分组数据,直观展现各组数据差别,例如常见以每周,每个月,或者不一样客户端划分为轴的数据。app
折线图分布式
特色:重点展示数据的变化趋势,常见以时间为轴,展现时间下的数据趋势。ide
饼状图
特色:不注重数据明细,强调数据中各项占整体的百分比,或者分布状况,注重模块模块之间的对比。
漏斗图
特色:强调数据之间的转化关系和递进规律,经典常见就是用户浏览量,点击量,到订单支付数量。
组合图
特色:多种基础图表组合,某些特殊业务数据,须要结合两种图或者更多种图表,强调装载该业务报表的关键组合信息。
顾名思义,放在大屏幕的报表,通常有多种丰富的业务数据,天然须要多种报表展示形式,比较有立体感和视觉上的冲击力。
絮叨一句:数据大屏在更多时候所追求的是让人印象深入,这才是最关键的,懂的都懂。
在报表类业务中,常用SQL分析语句,经常使用的几个方法:
业务类的报表虽然复杂,可是报表相关的数据接口相对而言简单,基于一些基础的统计SQL,生成报表数据。
产品和纬度表
CREATE TABLE `vc_product_info` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `product_sort` varchar(20) DEFAULT '' COMMENT '产品分类', `product_name` varchar(50) DEFAULT '' COMMENT '产品名称', `inventory` int(11) DEFAULT '0' COMMENT '库存剩余', `price` decimal(10,2) DEFAULT '0.00' COMMENT '单价', `total_sales` int(11) DEFAULT '0' COMMENT '销售总量', `sales_amount` decimal(10,2) DEFAULT '0.00' COMMENT '销售总额', `create_time` datetime DEFAULT NULL COMMENT '建立时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='产品信息表'; CREATE TABLE `vc_product_detail` ( `id` INT (11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `product_id` INT (11) NOT NULL COMMENT '产品ID', `place_origin` VARCHAR (50) DEFAULT '' COMMENT '产品产地', `weight` DECIMAL (10, 2) DEFAULT '0.00' COMMENT '重量', `color` VARCHAR (50) DEFAULT '' COMMENT '颜色', `high_praise` INT (11) DEFAULT '0' COMMENT '好评数量', `low_praise` INT (11) DEFAULT '0' COMMENT '差评数量', `create_time` datetime DEFAULT NULL COMMENT '建立时间', PRIMARY KEY (`id`) ) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '产品维度表';
基础查询语句
<mapper namespace="com.visual.chart.mapper.ProductInfoMapper"> <!-- 商品种类 --> <select id="countNum" resultType="java.lang.Integer"> SELECT COUNT(product_name) FROM vc_product_info </select> <!-- 销售总额度 --> <select id="sumAll" resultType="java.lang.Double"> SELECT SUM(sales_amount) FROM vc_product_info </select> <!-- 分组求和 --> <select id="groupSum" resultType="java.util.Map"> SELECT product_sort,SUM(sales_amount) FROM vc_product_info GROUP BY product_sort </select> <!-- 平均单价 --> <select id="average" resultType="java.lang.Double"> SELECT AVG(price) FROM vc_product_info </select> </mapper>
数据集概念
DataSet是一个数据的集合,一般以列表形式出现。每一列表明一个特定变量。每一行都对应于某一成员的数据集的问题。在统计分析的业务中,一般称为大宽表,方便业务分析。
数据集生成
视图方式
基于视图的方式,生成一个单表的数据集,方便简化操做。该方式不提倡,视图在大部分公司里是禁止使用的,这里只是单纯演示。
基于上述产品信息表和维度表,经过视图手段生成数据集,单纯为了简化业务分析的操做难度,由于多表联合简化成感受上的单表。
CREATE OR REPLACE VIEW data_set_view AS SELECT t1.*, t2.place_origin, t2.weight, t2.color, t2.high_praise, t2.low_praise FROM vc_product_info t1 LEFT JOIN vc_product_detail t2 ON t1.id = t2.product_id
任务方式
经过定时任务,获取要分析的数据结构,不断注入到分析表中,这是业务开发中最多见的报表数据集生成方式,有的甚至经过定时任务直接统计出报表须要的数据,不适应于大数据场景。
离线或实时计算
经过大数据分析手段,离线计算或者实时计算,获取业务报表数据,注入OLAP实时分析计算库,使用大数据分析场景。
BI工具能够快速对业务数据进行有效的整合,快速准确的提供报表并提出决策依据,帮助企业作出明智的业务经营决策。商业智能的概念最先在1996年提出。当时将商业智能定义为一类由数据仓库(或数据集市)、查询报表、数据分析、数据挖掘、数据备份和恢复等部分组成的、以帮助企业决策为目的技术及其应用。
基本搭建思路:
实际的开发过程是很是复杂的,管理各个业务线的数据源,联合分析,适配各类图表规范和样式,都是一个十分漫长的过程。
接口入参
承接上述业务场景,这里参数都须要动态传入,例如操做的:数据集、图表、参数归属轴、或者业务产品参数等。
@RestController public class DefineController { @Resource private DataSetService dataSetService ; /** * 自定义可视化报告入参 */ @GetMapping("/getDefChart") public Map<Integer, List<ChartParam>> getDefChart (){ List<ChartParam> chartParamList = new ArrayList<>() ; chartParamList.add(new ChartParam("X",1,"data_set_view","product_sort")) ; chartParamList.add(new ChartParam("X",1,"data_set_view","product_name")) ; chartParamList.add(new ChartParam("Y",2,"data_set_view","high_praise")) ; chartParamList.add(new ChartParam("Y",2,"data_set_view","low_praise")) ; chartParamList.add(new ChartParam("Z",3,"data_set_view","inventory",1)) ; chartParamList.add(new ChartParam("Z",3,"data_set_view","total_sales",1)) ; return dataSetService.analyData(chartParamList); } }
参数解析
根据各类动态参数,解析查询条件,获取查询结果。
@Service public class DataSetServiceImpl implements DataSetService { @Resource private DataSetMapper dataSetMapper ; // 分析任务划分 @Override public Map<Integer, List<ChartParam>> analyData(List<ChartParam> chartParamList) { Map<Integer, List<ChartParam>> dataMap = chartParamList.stream() .collect(Collectors .groupingBy(ChartParam::getDataType)); for (Integer dataType:dataMap.keySet()){ switch (dataType){ case 1: // Count 风格数据 taskCount(dataMap.get(dataType)); break; case 2: // Sum 风格数据 taskSum(dataMap.get(dataType)); break; case 3: // Percent 风格数据 taskPercent(dataMap.get(dataType)); break; default: break; } } return dataMap ; } // Count 数据执行 private void taskCount (List<ChartParam> chartParamList){ for (ChartParam chartParam:chartParamList){ chartParam.setResultNum(dataSetMapper.taskCount(chartParam.getColumnName(), chartParam.getTableName())); } } // Sum 数据执行 private void taskSum (List<ChartParam> chartParamList){ for (ChartParam chartParam:chartParamList){ chartParam.setResultNum(dataSetMapper.taskSum(chartParam.getColumnName(), chartParam.getTableName())); } } // Percent 数据执行 private void taskPercent (List<ChartParam> chartParamList){ for (ChartParam chartParam:chartParamList){ chartParam.setResultNum(dataSetMapper.taskPercent(chartParam.getColumnName(), chartParam.getTableName(), chartParam.getProductId())); } } }
总结一句:数据可视化工具建设是个漫长过程,不只仅能够分析本身公司的业务,也能够做为开放BI工具产生价值。
GitHub·地址 https://github.com/cicadasmile/data-manage-parent GitEE·地址 https://gitee.com/cicadasmile/data-manage-parent
推荐阅读:《架构设计系列》,萝卜青菜,各有所需
序号 | 标题 |
---|---|
01 | 架构设计:单服务.集群.分布式,基本区别和联系 |
02 | 架构设计:分布式业务系统中,全局ID生成策略 |
03 | 架构设计:分布式系统调度,Zookeeper集群化管理 |
04 | 架构设计:接口幂等性原则,防重复提交Token管理 |
05 | 架构设计:缓存管理模式,监控和内存回收策略 |