1. 程式人生 > >[基礎工具]離線資料立方體構建工具

[基礎工具]離線資料立方體構建工具

1. 背景

在資料的實際使用過程中,我們經常需要進行多維度的組合彙總,做一個數據立方體。常見的方法是在各個維度下進行group by,建立多個任務,這樣不利於程式碼檢視和維護,同時也浪費開發時間。

2. 資料立方體

業務場景

有一張資料表的結構如下

欄位名 欄位型別 註釋
fserver_ip string 伺服器ip
finterface string 服務介面名
ferror_code string 錯誤碼
fcall_num int 介面呼叫次數
fcall_time int 介面呼叫耗時

現在有一系列的查詢需求

  1. 檢視伺服器ip、服務介面名、指定錯誤碼下的介面呼叫次數、介面呼叫總耗時;
  2. 檢視伺服器ip下所有的介面呼叫次數、介面呼叫總耗時;
  3. 檢視錯誤碼下所有的介面呼叫次數、介面呼叫總耗時;
  4. 檢視伺服器ip、錯誤碼下所有的介面呼叫次數、介面呼叫總耗時;

……

上面各種查詢需求,都是針對不同維度進行組合統計的,用最笨的辦法,可能需要寫一堆group by xxx,但通過建立資料立方體,就可以在對某個(些)維度進行彙總統計時進行上卷等操作。

問題簡化

建立資料立方體之前,先要明確需要處理哪些維度、指標。下面是一個數據立方體

維度 指標
排列組合 fserver_ip finterface ferror_code sum(fcall_num) sum(fcall_time)
不組合(明細)
維度1組合 ✔️
維度2組合 ✔️
維度3組合 ✔️
維度12組合 ✔️ ✔️
維度13組合 ✔️ ✔️
維度23組合 ✔️ ✔️
維度123組合 ✔️ ✔️ ✔️

問題分析

實際上對於每個維度而言,是“組合”與“不組合”兩種可能,因此 M 個維度對應的組合數是 2M(或從排列組合角度,維度的組合數 = C0M+C1M+C2M+...+CMM=2M

3. 構建資料立方體

本文將使用hive streaming + python構建資料立方體

img_001

如上圖,hive streaming方式實際上是將hive sql查詢的記錄,逐條傳遞給jar/python等進行處理。構建資料立方體的過程,是需要對每條明細資料處理2M 次來生成各種維度組合,處理過程如下

img_002

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 次;

時間複雜度為:

O(N2M)

相關推薦

[基礎工具]離線資料立方體構建工具

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