精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

kylin與superset集成實現數據可視化

大數據 數據可視化
Apache kylin是一個開源分布式引擎,提供Hadoop之上的SQL查詢接口及多維分析(OLAP)能力以支持超大規模數據。而superset是airbnb開源的一款數據可視化工具。

Apache kylin是一個開源分布式引擎,提供Hadoop之上的SQL查詢接口及多維分析(OLAP)能力以支持超大規模數據。而superset是airbnb開源的一款數據可視化工具。

kylin在超大數據規模下仍然可以提供秒級甚至毫秒級sql響應的OLAP多維分析查詢服務。而且對服務器內存的要求也不像spark sql那么高,經過多方面的優化,數據膨脹率甚至可以控制在100%以內。它利用hive做預計算,然后建立多維的數據立方體,并存在hbase中,從而提供了實時查詢的能力。

superset也就是早先的caravel,提供了豐富的圖表供用戶配置。只要連上數據源,勾幾個簡單的配置,或者寫點sql。用戶就可以輕易的構建基于d3、nvd3、mapbox-gl等的炫酷圖表。

我廠也是選擇了kylin和superset,遺憾的是superset支持多種數據源,包括druid、hive、impala、sparkSQL、presto以及多種主流關系型數據庫,但是并不支持kylin。于是我們對其進行了改進。

首先觀察superset的源碼,它后臺使用Flask App Builder搭建的,數據訪問層用sqlalchemy實現。也就是說,它本質上可以支持所有數據源,只要實現一套kylin的dialect即可。而同時github上有一個pykylin項目,就是實現的這個dialect。這極大增強了我解決這個問題的信心。

正好前幾周,superset出了一個新的prod版本airbnb_prod.0.15.5.0。裝好它和pykylin之后,導入kylin數據源,成功!

但是點開sqllab想敲點sql驗證一下時,卻出了異常。

Debug了pykylin代碼,發現get_table_names方法的入參connection實際已經是sqlalchemy的Engine對象了,這可能是最新sqlalchemy的版本升級造成的。總之,將原來的代碼:

  1. def get_table_names(self, connectionschema=None, **kw):  
  2. return connection.connection.list_tables() 

改成:

  1. def get_table_names(self, engine, schema=None, **kw): 
  2. connection = engine.contextual_connect() 
  3. return connection.connection.list_tables() 

即可。

順便我們看到這里它擴展了sqlalchemy的list_tables方法,sqllab左上方的table選擇區還有列出所有schema的下拉框,于是我們順帶把list_schama方法也實現。connection.py添加:

  1. def list_schemas(self):   
  2.         route = 'tables_and_columns' 
  3.         params = {'project': self.project} 
  4.         tables = self.proxy.get(route, params=params) 
  5.         return [t['table_SCHEM'for t in tables] 

dialect.py添加:

  1. def get_schema_names(self, engine, schema=None, **kw):  
  2. connection = engine.contextual_connect()  
  3. return connection.connection.list_schemas() 

之后執行sql還是有錯:

pykylin在每次調用kylin的api時會首先登錄,以獲得JSESSIONID,并存入cookie中,這里是登錄失敗,檢查代碼,發現這里問題還挺多的,首先proxy.py中的login方法作者寫的是self.password = user應改成password。dialect.py中create_connect_args方法改為:

  1. def create_connect_args(self, url):   
  2.         opts = url.translate_connect_args() 
  3.         api_prefix = 'kylin/api/' 
  4.         args = { 
  5.             'username': opts['username'], 
  6.             'password': opts['password'], 
  7.             'endpoint''http://%s:%s/%s' % (opts['host'], opts['port'], api_prefix) 
  8.         } 
  9.         args.update(url.query) 
  10.         return [], args 

這樣大部分sql查詢沒有問題,但是有的查詢結果有部分值是null,這樣也會出錯。修改cursor.py的_type_mapped方法:

  1. def _type_mapped(self, result):   
  2.         meta = self.description 
  3.         size = len(meta) 
  4.         for i in range(0, size): 
  5.             column = meta[i] 
  6.             tpe = column[1] 
  7.             val = result[i] 
  8.             if val is None: 
  9.                 pass 
  10.             elif tpe == 'DATE'
  11.                 val = parser.parse(val) 
  12.             elif tpe == 'BIGINT' or tpe == 'INT' or tpe == 'TINYINT'
  13.                 val = int(val) 
  14.             elif tpe == 'DOUBLE' or tpe == 'FLOAT'
  15.                 val = float(val) 
  16.             elif tpe == 'BOOLEAN'
  17.                 val = (val == 'true'
  18.             result[i] = val 
  19.         return result 

這樣在sqllab中執行sql基本沒問題了。

下一步開始自定義slice,定制自己的可視化dashboard。

在這里再次遇到問題,superset會自動把count函數計算的列設置別名叫count,而count是kylin的關鍵字,因此導致查找失敗。修改superset的models.py的sqla_col方法:

  1. @property 
  2.    def sqla_col(self): 
  3.        name = self.metric_name 
  4.        if name == 'count'
  5.            name = 'total_count' 
  6.        return literal_column(self.expression).label(name

另外在slice中還經常會遇到pandas拋出的KeyError異常。這是因為在superset里面所有的關鍵字都是小寫,然而kylin返回的所有的數據metadata全是大寫,導致superset在kylin的返回結果中查詢關鍵字的時候出現找不到關鍵字的錯誤。

修改pykylin的cursor.py的execute方法。

  1. def execute(self, operation, parameters={}, acceptPartial=True, limit=None, offset=0):   
  2.         sql = operation % parameters 
  3.         data = { 
  4.             'sql': sql, 
  5.             'offset': offset, 
  6.             'limit': limit or self.connection.limit, 
  7.             'acceptPartial': acceptPartial, 
  8.             'project': self.connection.project 
  9.         } 
  10.         logger.debug("QUERY KYLIN: %s" % sql) 
  11.         resp = self.connection.proxy.post('query', json=data) 
  12.  
  13.         column_metas = resp['columnMetas'
  14.  
  15.         for c in column_metas: 
  16.             c['label'] = str(c['label']).lower() 
  17.             c['name'] = str(c['name']).lower() 
  18.  
  19.         self.description = [ 
  20.             [c['label'], c['columnTypeName'], 
  21.              c['displaySize'], 0, 
  22.              c['precision'], c['scale'], c['isNullable']] 
  23.             for c in column_metas 
  24.         ] 
  25.  
  26.         self.results = [self._type_mapped(r) for r in resp['results']] 
  27.         self.rowcount = len(self.results) 
  28.         self.fetched_rows = 0 
  29.         return self.rowcount 

最后,我發現在查找的字段包含kylin中的date類型時也會出錯。點擊slice頁面右上角的query按鈕,可以查看superset最終發送的sql。

將它直接拷貝到kylin的insight頁面去執行,發現報錯。原來kylin的date類型只支持年月日,而superset在添加日期搜索條件時為了實現定時刷新圖表而在sql的日期條件中都精確到了時分秒。關于這個我原先是在superset中做了修改。

在superset的models.py的get_query_str方法中:

  1. time_filter = dttm_col.get_time_filter(from_dttm, to_dttm) 

改為

  1. if engine.name == 'kylin':   
  2.     time_filter = dttm_col.get_date_filter(from_dttm, to_dttm) 
  3. else:   
  4.     time_filter = dttm_col.get_time_filter(from_dttm, to_dttm) 

添加get_date_filter,dt_sql_literal函數:

  1. def get_date_filter(self, start_dttm, end_dttm):   
  2.         col = self.sqla_col.label('__time'
  3.         return and_( 
  4.             col >= text(self.dt_sql_literal(start_dttm)), 
  5.             col <= text(self.dt_sql_literal(end_dttm)), 
  6.         ) 
  7.  
  8. def dt_sql_literal(self, dttm):   
  9.         return "'{}'".format(dttm.strftime('%Y-%m-%d')) 

這樣對于所有kylin數據源的查找時間范圍條件都將轉為年月日的格式。

不過我一直感覺這個改動不是很完美,是一種典型的打補丁的做法。后來我發現superset支持在列的設置頁面為一個日期列添加自定義的格式轉換函數

于是我在這里設置日期列格式

  1. TO_DATE(‘{}’, ‘yyyy-MM-dd’) 

然后可以看到slice這里sql中的該列都變成了to_date函數形式

最后的工作就是修改kylin源碼,添加對日期函數的支持。hive sql是支持to_date等日期格式轉換函數的,kylin憑什么不支持?

大致debug了一下kylin的源碼,kylin處理sql的入口在server-base模塊下的QueryController.java的query方法中。我發現在最終調用jdbc驅動執行sql之前,kylin會調QueryUtil類的massageSql方法來優化sql。主要是加上limit和offset參數。最后調內部類DefaultQueryTransformer的transform方法改掉sql中的一些通病,比如SUM(1)改成count(1)等。日期轉換函數的處理放在這后面我覺得是最合適的。

添加正則表達式,以匹配日期函數:

  1. private static final String TO_DATE = "(to_date|TO_DATE)\\(['|\"]([^'|\"]*)['|\"],\\s?['|\"]([^'|\"]*)['|\"]\\)" 
  2. private static final Pattern FN_TO_DATE = Pattern.compile(TO_DATE); 

添加日期轉行函數解析:

  1. private String executeFN(String sql) {   
  2.             Matcher m; 
  3.             while (true) { 
  4.                 m = FN_TO_DATE.matcher(sql); 
  5.                 if (!m.find()) 
  6.                     break; 
  7.                 String dateTime = m.group(2); 
  8.                 String format = m.group(3); 
  9.                 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
  10.                 Date dt = null
  11.                 try { 
  12.                     dt = sdf.parse(dateTime); 
  13.                 } catch (ParseException e) { 
  14.                     logger.error("Parse date error", e); 
  15.                 } 
  16.                 sdf = new SimpleDateFormat(format); 
  17.                 String date = sdf.format(dt); 
  18.                 String begin = sql.substring(0, m.start()); 
  19.                 String end = sql.substring(m.end(), sql.length()); 
  20.                 sql = begin + "'" + date + "'" + end
  21.             } 
  22.             return sql; 
  23.         } 

然后kylin就可以支持上面sql的執行了

最后,讓我們多嘗試一些可視化圖表吧,把它們做成dashboard

結論:kylin很好地支持了我廠每天上百GB數據的立方體建模和實時查找,結合superset的方案,作為我廠內部的可視化工具,收到了很好地效果。

責任編輯:武曉燕 來源: 36大數據
相關推薦

2017-10-14 13:54:26

數據可視化數據信息可視化

2020-03-11 14:39:26

數據可視化地圖可視化地理信息

2014-05-28 15:23:55

Rave

2018-01-02 11:13:20

數據可視化SupersetMetabase

2017-02-07 15:54:14

數據可視化數據分析

2018-03-07 11:35:49

Python可視化數據

2022-09-29 11:16:21

Python數據可視化

2017-07-12 16:07:49

大數據數據可視化

2015-08-20 10:00:45

可視化

2021-09-27 08:31:01

數據可視化柱狀圖折現圖

2014-08-19 10:47:11

數據可視化大數據

2020-10-22 08:52:52

Python數據集可視化

2023-11-30 09:34:14

數據可視化探索

2012-04-10 15:31:06

HTML 5

2017-06-19 08:30:35

大數據數據可視化報表

2022-08-26 09:15:58

Python可視化plotly

2023-05-08 16:29:34

2017-02-23 09:42:53

大數據數據可視化技術誤區

2009-04-21 14:26:41

可視化監控IT管理摩卡

2020-12-22 14:14:25

大數據數據可視化
點贊
收藏

51CTO技術棧公眾號

精品一区91| 色欧美激情视频在线| 99av国产精品欲麻豆| 亚洲欧美自拍一区| jizzzz日本| av免费在线观看网站| 岛国精品一区二区| 国产成人精品一区二区在线| 国产中文字幕久久| 超碰97久久国产精品牛牛| 色香色香欲天天天影视综合网| 亚洲视频小说| 老熟妇高潮一区二区高清视频| 久久综合激情| 色综合久久天天综线观看| 国产手机在线观看| 色悠久久久久综合先锋影音下载| 色屁屁一区二区| 亚洲天堂第一区| 黄色av网站在线| 国产激情91久久精品导航| 日韩av成人在线观看| 久久精品视频8| 日韩一级毛片| 日韩精品日韩在线观看| 国内自拍偷拍视频| 久久青草视频| 色天使色偷偷av一区二区| 国产精品第157页| 日本激情在线观看| 久久免费看少妇高潮| 国产精品v欧美精品∨日韩| 在线观看国产一区二区三区| 国产精品美女久久久| 欧美精品在线免费| 911国产在线| 精品一区av| 亚洲美女激情视频| 国产黑丝一区二区| 日韩激情欧美| 欧美日韩成人激情| 国产高潮免费视频| 日韩欧美看国产| 欧美日韩精品在线| 青青草精品视频在线| 伊人222成人综合网| 亚洲欧美一区二区三区国产精品| 亚洲国产日韩欧美| 成人在线观看一区| 国产欧美一区二区精品性色| 欧美激情视频一区二区三区| 涩涩视频在线观看免费| 97精品电影院| 精选一区二区三区四区五区| 欧美一级一区二区三区| 成人夜色视频网站在线观看| 91一区二区三区| 国产福利小视频| 粉嫩一区二区三区性色av| 91传媒视频免费| 亚洲第一页视频| 粉嫩嫩av羞羞动漫久久久| 99久久99久久精品国产片| www黄色网址| 国产成人免费在线| 国产aⅴ精品一区二区三区黄| 欧美jizz19性欧美| 2019国产精品| 奇米888一区二区三区| 亚洲三区在线观看无套内射| 久久亚洲欧美国产精品乐播 | 亚洲精品国产欧美| 欧美日韩人妻精品一区在线| 美女av一区| 亚洲色图15p| 亚洲毛片亚洲毛片亚洲毛片| 欧美激情欧美| 久久国产精品首页| 精品亚洲永久免费| 香蕉久久久久久久av网站| 国产成人综合久久| 国产精品国产三级国产aⅴ| 国产精品一区在线观看你懂的| 999热视频在线观看| 天堂在线视频免费观看| 国产亚洲欧美激情| 日韩视频在线免费播放| 国产www视频在线观看| 欧美丝袜第一区| 久久婷五月综合| 日韩精品视频一区二区三区| 亚洲精品久久久一区二区三区| 伊人网伊人影院| 亚洲综合专区| 欧美在线视频在线播放完整版免费观看| 国产成人麻豆免费观看| 国产精品一区二区无线| 鲁片一区二区三区| 成人在线观看亚洲| 色综合久久久久网| 国产毛片久久久久久| 西野翔中文久久精品字幕| 日韩在线观看免费高清完整版| 五月天婷婷网站| 久久se精品一区二区| 极品尤物一区二区三区| 免费高清完整在线观看| 午夜不卡在线视频| 特黄视频免费观看| 亚洲国产合集| 欧美激情va永久在线播放| 特级西西444www大胆免费看| 成人免费视频视频在线观看免费 | 日本免费一区视频| 亚洲欧美自拍偷拍| 免费看a级黄色片| 9国产精品午夜| 日韩亚洲国产中文字幕| 好吊色在线视频| 豆国产96在线|亚洲| 亚洲成人网上| 澳门成人av网| 精品国产一区二区三区久久影院 | 日韩精品中文字幕第1页| 国产69精品99久久久久久宅男| 一起草av在线| 国产欧美日韩卡一| 日韩av黄色网址| 成人av动漫| 欧美理论片在线观看| 中文天堂在线资源| 久久久国际精品| 18禁男女爽爽爽午夜网站免费| 亚洲一区二区三区在线免费| 日韩视频在线免费观看| 91麻豆精品在线| 久久精品视频在线免费观看| 波多野结衣之无限发射| 亚洲国产aⅴ精品一区二区| 久久亚洲精品小早川怜子66| 伊人网综合在线| 国产精品视频第一区| 999精品网站| 中国av一区| 欧美在线激情视频| 欧美套图亚洲一区| 色婷婷av一区二区三区大白胸| 97人妻精品一区二区三区免 | 久久久在线观看| 成人高潮片免费视频| 亚洲久草在线视频| 亚洲国产日韩在线一区| 欧美成人一品| 成人自拍爱视频| 2021天堂中文幕一二区在线观| 欧美成人vr18sexvr| 久久婷婷一区二区| 成人99免费视频| 免费看又黄又无码的网站| 欧美三级电影在线| 热久久99这里有精品| 国产在线小视频| 欧美性videosxxxxx| 99久久久无码国产精品不卡| 国内外成人在线| 国产人妻人伦精品| 中文字幕一区二区三区四区久久| 久久久久久久亚洲精品| 污视频在线免费| 欧美色道久久88综合亚洲精品| 97人妻天天摸天天爽天天| 免费久久99精品国产自在现线| 欧美亚州在线观看| 青青伊人久久| 欧美黑人国产人伦爽爽爽| 色一情一乱一区二区三区| 欧美日韩亚洲一区二| 亚洲黄色小说视频| 国内成人免费视频| 日韩黄色短视频| 国产亚洲欧美日韩在线观看一区二区| 国产精品美女久久久免费| 黄色精品免费看| 亚洲国产成人久久| 国产精品无码粉嫩小泬| 亚洲欧美偷拍三级| 亚洲黄色免费在线观看| 蜜臀av一区二区三区| 青青在线视频免费观看| 亚洲福利网站| 51蜜桃传媒精品一区二区| 老司机深夜福利在线观看| 在线观看欧美视频| 韩国av电影在线观看| 91九色最新地址| 91精品国产闺蜜国产在线闺蜜| 99久久精品国产网站| 国产一级片自拍| 日韩午夜在线电影| 久久免费视频2| 蜜桃一区二区三区| 91亚洲精华国产精华| 中文字幕乱码中文乱码51精品| 久久久国产一区| 美女欧美视频在线观看免费 | 一区二区国产视频| 中文字幕免费在线看线人动作大片| 国产精品影视在线观看| 日本www高清视频| 亚洲午夜极品| 在线观看日本一区| 国产一区不卡| 国内精品一区二区| 不卡一区视频| 国产精品三级美女白浆呻吟 | 亚洲午夜电影在线观看| 国产又黄又粗视频| 99亚偷拍自图区亚洲| 国产精品久久久久野外| 日韩精品91亚洲二区在线观看 | 亚洲专区一区二区三区| 老司机午夜网站| 精品成人影院| 久久国产一区| a级日韩大片| 91色精品视频在线| 精品美女一区| 国产成人拍精品视频午夜网站| a毛片不卡免费看片| 萌白酱国产一区二区| 求av网址在线观看| 一本大道久久加勒比香蕉| 日本成人一区| 日韩激情片免费| 神马午夜一区二区| 精品国产一区a| 亚洲国产成人在线观看| 91精品国产91久久综合桃花| 一级特黄aaa| 欧美在线一区二区| 五月婷婷六月婷婷| 91久久精品一区二区三区| 久久人妻免费视频| 一本色道a无线码一区v| 亚洲GV成人无码久久精品| 欧美日韩国产麻豆| 日韩欧美一级视频| 懂色av影视一区二区三区| 97超碰人人干| 欧美日韩中文字幕| 99精品人妻国产毛片| 色乱码一区二区三区88| 国产在线观看第一页| 欧美性三三影院| 亚洲无码久久久久| 91精品国产综合久久久蜜臀粉嫩| 国产孕妇孕交大片孕| 欧美一区二区三区视频在线 | 不卡的免费av| 欧美日韩国产一区二区| 亚洲国产成人无码av在线| 欧美视频13p| 精品无码一区二区三区的天堂| 欧美在线啊v一区| 一级黄色片在线| 日韩一区二区在线观看视频| 亚洲不卡免费视频| 亚洲福利影片在线| 美国一级片在线免费观看视频 | a免费在线观看| 欧美国产日本在线| 国产一二在线播放| 国产成人综合亚洲| 国产美女视频一区二区| 国产精品视频免费一区| 国产欧美一区二区三区精品观看| 翔田千里亚洲一二三区| 亚洲深深色噜噜狠狠爱网站| 欧美性潮喷xxxxx免费视频看| 免费在线播放第一区高清av| 色综合手机在线| 国产精品中文有码| www.自拍偷拍| 亚洲视频 欧洲视频| 五月天婷婷丁香| 欧美在线播放高清精品| 亚洲精品久久久久久动漫器材一区 | 瑟瑟视频在线免费观看| 欧美一区二区三区视频在线| 色中色在线视频| 久久精品99久久久香蕉| 岛国在线视频网站| 国产欧美精品日韩精品| 日日夜夜精品视频| 相泽南亚洲一区二区在线播放| 激情欧美国产欧美| 亚洲综合日韩欧美| 99久久免费精品| 国产三级精品三级观看| 精品国产91乱高清在线观看| 亚洲一二区视频| 亚洲精品456在线播放狼人| 18视频免费网址在线观看| 韩国19禁主播vip福利视频| 午夜激情成人网| 国产乱子伦精品| 亚洲v在线看| 日韩一级免费在线观看| 成人av综合在线| 日本不卡一二区| 日韩欧美亚洲范冰冰与中字| 99精品视频免费看| 一区国产精品视频| 嗯啊主人调教在线播放视频| 91在线视频精品| 精品国产一区二区三区| 波多野结衣乳巨码无在线| 国产一区在线精品| 娇妻被老王脔到高潮失禁视频| 亚洲福中文字幕伊人影院| 国产精品无码久久av| 在线不卡国产精品| 中文字幕在线免费观看视频| 成人一区二区在线| 欧美一区二区三区久久精品| 欧美wwwwwww| 国产免费观看久久| 99精品在线播放| 亚洲激情在线视频| wwwwxxxx在线观看| 99精彩视频| 亚洲精品二区三区| 亚洲天堂av一区二区| 国产精品久久久久aaaa樱花| 无码人妻精品一区二区三区蜜桃91 | 蜜臀av午夜一区二区三区 | 成人午夜电影免费在线观看| 久久久国产精品| 国内自拍第二页| 国产精品久久久久aaaa樱花 | h片视频在线观看| 国产精品永久入口久久久| 亚洲午夜黄色| 男人的天堂影院| 精品国产精品自拍| 三级在线播放| 欧美做受高潮电影o| 亚洲免费福利一区| 午夜精品久久久内射近拍高清| 91女厕偷拍女厕偷拍高清| 国产成人一区二区三区影院在线| 亚洲国产精久久久久久 | 亚洲一区二区偷拍精品| 亚洲精品福利网站| 97超碰蝌蚪网人人做人人爽 | 国产又粗又猛又爽又黄91精品| 精品无码久久久久成人漫画| 日韩天堂在线观看| 国产极品人妖在线观看| 久久久久久久久一区| 视频一区在线播放| 国产91丝袜美女在线播放| 欧美日韩视频第一区| 欧美a免费在线| 999在线免费观看视频| 悠悠资源网久久精品| 一区二区三区免费在线观看视频| 色香蕉成人二区免费| av黄色在线观看| 亚洲va欧美va国产综合剧情| 国内自拍视频一区二区三区 | 国产精品热久久| 欧美成人小视频| 秋霞综合在线视频| 污视频免费在线观看网站| 亚洲婷婷在线视频| 色偷偷在线观看| 国产精品入口尤物| 欧美特黄一区| 无码人妻精品一区二区三应用大全| 在线观看免费成人| 曰本三级在线| 欧美性bbwbbwbbwhd| 国产乱子伦视频一区二区三区 | 在线观看www91| 18+视频在线观看| 久久精品女人的天堂av| 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产高清视频在线观看| 91pron在线| 久久免费国产| 免费中文字幕在线| 亚洲欧美日韩精品久久亚洲区| 996久久国产精品线观看| 国产素人在线观看| 国产精品视频第一区| 亚洲av成人无码网天堂| 成人av.网址在线网站| 国产欧美日韩亚洲一区二区三区| 免费看特级毛片|