[基礎工具]離線資料立方體構建工具
1. 背景
在資料的實際使用過程中,我們經常需要進行多維度的組合彙總,做一個數據立方體。常見的方法是在各個維度下進行group by,建立多個任務,這樣不利於程式碼檢視和維護,同時也浪費開發時間。
2. 資料立方體
業務場景
有一張資料表的結構如下
欄位名 | 欄位型別 | 註釋 |
---|---|---|
fserver_ip | string | 伺服器ip |
finterface | string | 服務介面名 |
ferror_code | string | 錯誤碼 |
fcall_num | int | 介面呼叫次數 |
fcall_time | int | 介面呼叫耗時 |
現在有一系列的查詢需求
- 檢視伺服器ip、服務介面名、指定錯誤碼下的介面呼叫次數、介面呼叫總耗時;
- 檢視伺服器ip下所有的介面呼叫次數、介面呼叫總耗時;
- 檢視錯誤碼下所有的介面呼叫次數、介面呼叫總耗時;
- 檢視伺服器ip、錯誤碼下所有的介面呼叫次數、介面呼叫總耗時;
……
上面各種查詢需求,都是針對不同維度進行組合統計的,用最笨的辦法,可能需要寫一堆group by xxx,但通過建立資料立方體,就可以在對某個(些)維度進行彙總統計時進行上卷等操作。
問題簡化
建立資料立方體之前,先要明確需要處理哪些維度、指標。下面是一個數據立方體
維度 | 指標 | ||||
---|---|---|---|---|---|
排列組合 | fserver_ip | finterface | ferror_code | sum(fcall_num) | sum(fcall_time) |
不組合(明細) | |||||
維度1組合 | ✔️ | ||||
維度2組合 | ✔️ | ||||
維度3組合 | ✔️ | ||||
維度12組合 | ✔️ | ✔️ | |||
維度13組合 | ✔️ | ✔️ | |||
維度23組合 | ✔️ | ✔️ | |||
維度123組合 | ✔️ | ✔️ | ✔️ |
問題分析
實際上對於每個維度而言,是“組合”與“不組合”兩種可能,因此 M 個維度對應的組合數是
3. 構建資料立方體
本文將使用hive streaming + python構建資料立方體
如上圖,hive streaming方式實際上是將hive sql查詢的記錄,逐條傳遞給jar/python等進行處理。構建資料立方體的過程,是需要對每條明細資料處理
3.1. Python程式碼
cube.py
def binary_reflect_gray_code(n):
"""
生成n位的二進位制反格雷碼, 即n個元素的全組合
:param n:
:return:
"""
if n == 1:
return ["0", "1"]
L1 = binary_reflect_gray_code(n-1)
L2 = copy.deepcopy(L1)
L2.reverse()
L1 = ["0" + l for l in L1]
L2 = ["1" + l for l in L2]
L = L1 + L2
return L
if __name__ == "__main__":
not_group_set = []
if len(sys.argv) < 4:
print 'Error! Not Enough Params.'
print 'Usage: python cube.py <field_num> <dimension_num> <> <not_group_set>'
sys.exit(1)
elif len(sys.argv) > 4:
_, field_cnt, dimension_cnt, split_sign = sys.argv[0:4]
not_group_set = sys.argv[4:]
elif len(sys.argv) == 4:
_, field_cnt, dimension_cnt, split_sign = sys.argv[0:4]
combination_list = binary_reflect_gray_code(dimension_cnt)
for line in sys.stdin:
kv = line.replace('\n', '').split('\t')
for combination in combination_list:
if combination not in not_group_set:
for item in range(int(field_cnt)):
if item < int(dimension_cnt):
if combination[item] == '0':
print '%s\t' % (kv[item]),
else:
print '%s\t' % (split_sign),
else:
print '%s\t' % (kv[item]),
print
3.2. 引數說明
引數 | 是否必傳 | 樣例 | 註釋 |
---|---|---|---|
引數1 | √ | 5 | 指的是傳入TRANSFORM的列數 |
引數2 | √ | 3 | 指的是前幾列是維度,故而需要把維度放在前面 |
引數3 | √ | all | 指的是彙總列替代的值,比如all |
引數4-n | 選填 | 00 01 10 | 指的是不需要維度彙總的組合,支援多個組合。比如不需要第一列彙總,則寫10和11(兩位數字表示維度數為2,其中第一位1表示按第一個維度彙總,比如指定了10,則表示過濾按第一列彙總的資料) |
3.3. 使用說明
1) 新建檔案cube.sql
,新增如下HQL指令碼
add file cube.py;
select
fserver_ip,
finterface,
ferr_code,
sum(fcall_num) as fcall_num,
sum(fcall_time) as fcall_time
from (
from dp_monitor.t_monitor_acc
select TRANSFORM(fserver_ip, finterface, ferr_code, fcall_num, fcall_time)
using 'python cube.py 5 3 all' as
fserver_ip, finterface, ferr_code, fcall_num, fcall_time where fdate = '2017-10-16'
) tmp
group by fserver_ip, finterface, ferr_code
order by fserver_ip, finterface, ferr_code;
2) 使用hive命令列執行HQL指令碼
hive -f cube.sql
3.4. 如何進行本地測試
本地匯出資料進行測試:
hive -e "select fserver_ip, finterface, ferr_code, fcall_num, fcall_time from dp_monitor.t_monitor_acc where fdate = '2017-10-16' limit 100" > a.txt
cat a.txt | python cube.py 5 3 all
3.5. 效能效率
假設:
- 維度數 = M(0 < M <
102 ),指令碼會先生成 M 位的二進位制組合,M 位的二進位制組合共有2M 個; - 表資料 = N(0 < N <
1010 ),指令碼會逐條資料進行處理,每條資料會處理2M 次;
時間複雜度為:
相關推薦
[基礎工具]離線資料立方體構建工具
1. 背景 在資料的實際使用過程中,我們經常需要進行多維度的組合彙總,做一個數據立方體。常見的方法是在各個維度下進行group by,建立多個任務,這樣不利於程式碼檢視和維護,同時也浪費開發時間。 2. 資料立方體 業務場景 有一張資料表的結
Yarn 構建工具入門基礎
一、yarn的背景和介紹一直以來,我們在安裝和管理依賴的時候基本上都會使用npm,npm是一個非常優秀全面且廣受歡迎的包管理工具,它奠定了前端模組化開發的基石,為前端的發展做出了不可磨滅的貢獻。 yarn就是一個類似於npm的包管理工具,它是由facebook推出並
構建資料倉庫的工具Hive
Hive簡介 什麼是Hive hive是基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔案對映為一張資料庫表,並提供的sql查詢功能,可以將sql語句轉換為MapReduce任務進行執行。 其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapRe
深入淺出的webpack4構建工具---比mock模擬資料更簡單的方式(二十一)
在實際應用場景中,總感覺mock資料比較麻煩,並且在webpack3中mock資料的程式碼在正式環境並不能自動移除掉,導致正式環境有mock相對應的程式碼,但是在webpack4中,會使用 tree shaking外掛會自動移除掉未使用到的程式碼的,想要了解tree shaking(https://www
前端構建工具gulp的使用基礎
gulp.js是一個前端構建工具,與grunt.js相比,gulp.js無需寫一大堆繁雜的配置引數,僅有四個API,都非常簡單,學習起來很容易,而且gulp.js使用的是node.js中stream來讀取和操作資料,其速度更快。如果你還沒有使用過前端構建工具,或者覺得gru
項目自動構建工具對比(Maven、Gradle、Ant)
執行 存儲 maven構建 width pil 特點 print 新的 jar Java世界中主要有三大構建工具:Ant、Maven和Gradle。經過幾年的發展,Ant幾乎銷聲匿跡、Maven也日薄西山,而Gradle的發展則如日中天。 Maven的主要功能主要分為5點,
前端構建工具gulp
pack 合並 項目流程 nload 控制 編譯 插件安裝 pro 目的 前段時間做一個項目,試著用gulp來構建前端代碼。今天簡單總結了一下: 一:安裝gulp環境 1. 安裝node 在node官方文檔下載匹配的版本 我下載的是如下圖的版本。http:/
構建工具Gulp
pac 表示 uil file path 打包 查找 方式 scrip chrome 前面的話 與grunt類似,gulp也是構建工具,但相比於grunt的頻繁IO操作,gulp的流操作能更快更便捷地完成構建工作。gulp借鑒了Unix操作系統的管道(pipe)思想,
webpack前端工程化構建工具的使用
link 安裝webpack 文件 onf color 如果 col ima 熱更新 一.模塊打包機 1.創建文件 在目標文件下建立一個src文件夾作為js代碼區;作為例子,我創建了兩個js文件,並利用commonJS規範require引入到index.js中; mod
前端構建工具裏babel-polyfill的使用問題
cor html con pre airbnb 對象 3.1 hot 正常 看了很多react工程的package.json文件,裏面都沒有使用babel-polyfill,那對ES6的新API是如何做到被IE9這樣的瀏覽器識別的呢,難道在webpack打包的時
Bazel構建工具的安裝
install get 更新 testin tps 構建工具 repo custom https 官方Doc:https://docs.bazel.build/versions/master/install-ubuntu.html 使用Bazel定制的APT存儲庫 (re
自動化構建工具
java環境 cnblogs .com 自動化 java 一點 log 構建工具 ive 1. ant是一個將軟件編譯、測試、部署等步驟聯系在一起加以自動化的一個工具,大多用於java環境的軟件開發。 詳解見:http://www.cnblogs.com/huozhiche
gulp自動化構建工具使用總結
名稱 測試 構建工具 3.2 str 鏡像 運行 sta cnp 簡介: gulp是前端開發過程中對代碼進行構建的工具,是自動化項目的構建利器;她不僅能對網站資源進行優化,而且在開發過程中很多重復的任務能夠使用正確的工具自動完成;使用她,我們不僅可以很愉快的編寫代碼,而且
前端工程構建工具之Yeoman
例如 打開 gruntfile tool span www clas angular 具體步驟 一、Yeoman 簡介 通常在開發新項目時我們都需要配置工程環境,開發目錄,需要下載一些庫、框架文件(如 jQuery、Backbone 等),配置編譯環境(Less、Sass、
webpack構建工具快速上手指南
pre 去掉空格 spa net 例如 模式 面板 hand 根據 最近在研究react項目,接觸到webpack打包工具。剛接觸的時候一臉茫然,經過最近的學習,下面我來帶大家開啟webpack入門之旅。 webpack是什麽 webpack是近期最火的一款模塊加載器兼
JavaScript自動化構建工具入門----grunt、gulp、webpack
cli 簡單 cpu占用率高 mini tco get %20 pan 情況 蠻荒時代的程序員: 做項目的時候,會有大量的js 大量的css 需要合並壓縮,大量時間需要用到合並壓縮 在前端開發中會出現很多重復性無意義的勞動 自動化時代的程序員: 希望一切都可以自動完
mvnw是什麽(Maven Wrapper/Maven保持構建工具版本一直的工具)
保持 內部 產生 clas 而是 用例 是我 maven 文件 背景 Maven是一款非常流行的Java項目構建軟件,它集項目的依賴管理、測試用例運行、打包、構件管理於一身,是我們工作的好幫手,maven飛速發展,它的發行版本也越來越多,如果我們的項目是基於Maven構件
構建工具
軟件 bsp node strong 管理 css壓縮 ron 插件 合並 node.js 環境(Chrome V8 JavaScript )npm(默認node包管理器 -嵌套地依賴管理 多用於管理後端包)bower (軟件包管理器- 扁平依賴管理-偏向去前端報管理
前端自動化構建工具-gulp
出現 ssa uglify 提醒 連接 變化 監聽 前端 復雜 gulp 和grunt這兩個是我知道的自動構建工具,但是說實話都沒在項目中用過,不太清楚自動化構建是什麽意思, 1、grunt和gulp有什麽相同點和不同點? (1)、易於使用:采用代碼優於配置策略,gul