本文源碼: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 | 架構設計:緩存管理模式,監控和內存回收策略 |