精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美黑吊大战白妞| 日本a√在线观看| av在线亚洲天堂| 欧美黄色aaaa| 欧美变态tickle挠乳网站| 国产日韩欧美大片| 亚洲黄色在线观看视频| 国产一区二区你懂的| 亚洲精品综合精品自拍| 色综合天天色综合| 欧洲美女少妇精品| 国产一区二区三区国产| 久久久久国产精品www| 日本黄色动态图| 日日av拍夜夜添久久免费| 国产精品久久久久影院亚瑟 | 色综合久久久久综合体| 欧美一区二区三区精美影视| 一区二区三区精| 欧美日韩三区| 亚洲天堂av高清| 992tv人人草| 美女av在线免费看| 中文字幕在线观看不卡| 国产伦精品一区| 天天操天天操天天操天天| 欧美一级精品| 亚洲成人xxx| 午夜精品在线免费观看| caoporn视频在线观看| 国产精品久久久久久久午夜片| 国产经典一区二区三区| 中文字幕+乱码+中文字幕明步| 亚洲视频观看| 日韩视频中文字幕| 精品少妇一区二区三区免费观| 国产高清日韩| 在线国产亚洲欧美| 日韩精品 欧美| a级片国产精品自在拍在线播放| 2021国产精品久久精品| http;//www.99re视频| 亚洲性猛交富婆| 国产精品久久久久久久免费软件 | 日韩精品一区二区三区色欲av| 91精品久久| 亚洲国产精品传媒在线观看| 好吊妞www.84com只有这里才有精品 | 欧美人与禽猛交乱配视频| 亚洲天堂色网站| 高清中文字幕mv的电影| 精品国产亚洲一区二区在线观看| 91国偷自产一区二区使用方法| 和岳每晚弄的高潮嗷嗷叫视频| 超碰超碰在线| 中文字幕一区二区三| 日韩av电影免费播放| 天堂91在线| 波多野结衣中文一区| 成人免费在线看片| www.日韩高清| 国产乱人伦偷精品视频免下载| 国产精品视频永久免费播放| 亚洲黄网在线观看| 久久久久久网| 热久久免费国产视频| 免费黄色网址在线| 销魂美女一区二区三区视频在线| 97久久久久久| 国产欧美日韩另类| 日韩视频中文| 97超碰蝌蚪网人人做人人爽| 免费观看一级视频| 99亚洲伊人久久精品影院红桃| 久久久亚洲精品视频| 在线一区高清| 亚洲成人三级| 国产精品国产三级国产普通话蜜臀| 神马影院我不卡| 黄色av免费在线看| 欧美高清在线一区| 一区二区三区国产福利| 麻豆av在线导航| 亚洲码国产岛国毛片在线| 精品一区二区三区毛片| 日韩欧美一起| 午夜成人免费视频| 99色精品视频| 日本精品网站| 欧美乱妇15p| 日本一本在线视频| 东京久久高清| 日韩精品高清视频| 亚洲色成人网站www永久四虎| 大色综合视频网站在线播放| 日韩一区二区三区xxxx| 青娱乐在线视频免费观看| 在线日韩欧美| 国产成人精品国内自产拍免费看| 这里只有精品免费视频| 国内成人精品2018免费看| aa成人免费视频| 视频国产一区二区三区| 国产精品久久看| 黄色一级片国产| 精品丝袜在线| 欧美日韩一区二区在线观看| 亚洲制服中文字幕| 老牛精品亚洲成av人片| 中文字幕日韩精品在线观看| 免费在线看黄网址| 久久免费高清| 亚洲一区二区免费| 日韩专区一区二区| 亚洲人xxxx| 欧美日韩免费高清| 天堂资源在线中文| 亚洲国产日韩综合久久精品| 久久精品网站视频| 视频精品一区| 亚洲色图日韩av| 青青草原在线免费观看| 天堂久久久久va久久久久| 国产在线观看91精品一区| 日韩一级中文字幕| 中文字幕欧美一| 久久国产成人精品国产成人亚洲| 亚洲图片小说区| 亚洲精品视频中文字幕| 艳妇乳肉豪妇荡乳xxx| 日韩一区二区在线| 秋霞成人午夜鲁丝一区二区三区| 国产高潮在线观看| 国产精品久久久久久妇女6080 | 秋霞成人午夜鲁丝一区二区三区| 国产黄色一区二区| 国产精品污网站| 欧美日韩在线视频一区二区三区| 精品国模一区二区三区欧美| 一本色道久久综合狠狠躁篇的优点| 国产一级片免费看| 国产一区二区在线视频| 五月天综合网| 亚洲一二三四| 亚洲国产精品专区久久| 免费日韩在线视频| 韩国理伦片一区二区三区在线播放| 欧美少妇一区| caoporn视频在线| 精品国产一二三| 国产精品老熟女一区二区| 麻豆国产欧美日韩综合精品二区 | 国产黄a三级三级三级av在线看| 亚洲成人av一区二区三区| 99re6在线观看| 国内精品久久久久久久影视简单| 午夜精品www| 亚洲av无码一区二区三区dv| 亚洲情趣在线观看| 欧美在线a视频| 91精品国产91久久综合| 国产有码在线一区二区视频| 91啦中文在线| 欧美日韩一区二区三区四区| 91网站免费入口| 久久久久国产精品午夜一区| 欧美日韩电影一区二区| 原纱央莉成人av片| 亚洲欧美日韩中文视频| 国产精品久久久久久人| 久久久久久一级片| 久久精品网站视频| re久久精品视频| 国产精自产拍久久久久久蜜| 素人av在线| 91精品中文字幕一区二区三区 | 成人欧美一区二区三区黑人麻豆| jizzzz日本| 久久精品影视| aaa级精品久久久国产片| 国产美女福利在线观看| 日韩精品视频在线观看免费| 国产91精品看黄网站在线观看| 久久亚洲欧美国产精品乐播| 日韩欧美xxxx| 日韩中文在线电影| 亚洲在线第一页| 国产区美女在线| 亚洲欧美国产va在线影院| 无码人妻精品一区二区三区蜜桃91 | 久久这里只有精品99| 99热这里只有精品3| 亚洲国产综合人成综合网站| 美女又爽又黄视频毛茸茸| 久久尤物视频| 亚洲综合激情五月| 国产精品调教| 国产精品久久久久久久久久ktv| 三区四区电影在线观看| 精品久久免费看| 天天做天天爱夜夜爽| 中文字幕欧美国产| 日本少妇xxx| 性感少妇一区| 中文字幕色一区二区| 久久综合另类图片小说| 国产精品永久在线| 888av在线视频| 在线视频日本亚洲性| 性一交一乱一乱一视频| 色综合视频一区二区三区高清| 少妇高潮在线观看| 91在线视频网址| 亚洲在线观看网站| 国产日韩欧美在线播放不卡| 中文字幕一区综合| 久久99精品久久久久久园产越南| 91久久国产精品91久久性色| 色综合桃花网| 美女啪啪无遮挡免费久久网站| 色播色播色播色播色播在线| 91精品国产全国免费观看| 日本免费在线观看视频| 一区二区三区久久| 国产精品无码无卡无需播放器| 成人国产亚洲欧美成人综合网| 15—17女人毛片| 99视频一区| 欧美交换配乱吟粗大25p| 欧美丝袜丝交足nylons172| 国产高清精品一区二区三区| 电影一区二区三区久久免费观看| 国产精品第一第二| 在线观看爽视频| 欧美精品aaa| 精精国产xxxx视频在线| 一区二区三区四区在线观看视频| 污污网站在线免费观看| 日韩欧美在线1卡| 中文字幕乱码人妻无码久久 | 日日噜噜噜噜人人爽亚洲精品| 亚洲一区在线视频| caoporn91| 最新国产乱人伦偷精品免费网站| 婷婷五月色综合| 曰本一区二区三区视频| 国产一区二区在线网站| 精品久久久久久久久久岛国gif| 国产精品高潮粉嫩av| 韩国主播福利视频一区二区三区| 韩国国内大量揄拍精品视频| 97caopor国产在线视频| 久久伊人91精品综合网站| 午夜免费福利在线观看| 一区二区三区四区精品| 福利视频在线看| 亚洲偷熟乱区亚洲香蕉av| 日本午夜在线视频| 亚洲精品视频二区| 日本一二三区在线视频| 亚洲欧美在线磁力| 久香视频在线观看| 亚洲精品自在久久| 成人在线观看网站| 中文字幕精品在线| 欧美极品另类| 久久精品欧美视频| 91cn在线观看| 欧美伦理91i| 欧美人与性动交α欧美精品济南到 | 日本成人免费在线观看| 国产精品三级av| 三级黄色在线观看| 亚洲猫色日本管| 久久久久久久久艹| 亚洲成在人线在线播放| 青青草免费观看视频| 日韩欧美一区二区三区久久| 91黑人精品一区二区三区| 精品视频色一区| 国产免费黄色网址| 日韩精品一区二区在线观看| 免费看国产片在线观看| 亚洲精品久久久久久下一站 | 久久久精品人妻一区二区三区| 国产不卡一区视频| 国产黄色三级网站| 国产欧美日韩三区| 黄色片在线观看网站| 亚洲不卡在线观看| 亚洲精品国产无码| 欧美一级精品大片| 牛牛热在线视频| 少妇高潮久久77777| 日本h片在线| 欧美一区二区三区免费视| 日韩精品免费观看视频| 92国产精品视频| 日韩三级av| 一区二区精品在线| 亚洲国产午夜| 天天爽人人爽夜夜爽| 国产激情91久久精品导航| 国产人妻人伦精品1国产丝袜| 国产欧美久久久精品影院| 欧美日韩在线视频免费| 日韩欧美主播在线| 国产强伦人妻毛片| 精品亚洲永久免费精品| 国产1区在线| 欧洲亚洲女同hd| 国产一区二区av在线| 久久综合狠狠综合久久综青草| 99久久久国产精品美女| 欧美国产亚洲一区| 国产又黄又大久久| 精品人伦一区二区三电影| 亚洲综合一区二区精品导航| 中文字幕日韩免费| 亚洲第一网站免费视频| 91短视频版在线观看www免费| 国模吧一区二区三区| 成人国产精品一区二区免费麻豆 | 香蕉久久99| 成年人视频大全| 日韩电影免费在线看| 国产免费a级片| 中文字幕一区二区日韩精品绯色| 国产无套丰满白嫩对白| 欧美videos中文字幕| 男人的天堂在线视频免费观看| 91精品国产91久久久久久| 蜜桃在线一区| 亚洲欧洲日韩精品| 久久亚洲影院| 国产又粗又猛又色| 亚洲一区二区在线观看视频| 国产精品久久欧美久久一区| 亚洲欧洲激情在线| 午夜激情电影在线播放| av一区二区三区四区电影| 久久久人成影片免费观看| 三级a在线观看| 久久久无码精品亚洲日韩按摩| 国产极品在线播放| 欧美大片一区二区三区| 国产精品久久麻豆| 成人久久久久爱| 日韩不卡一区| 亚洲一区二区蜜桃| 久久精品视频在线免费观看| 天天综合天天干| 亚洲精品久久久久中文字幕欢迎你| 性欧美video高清bbw| 亚洲自拍在线观看| 一本精品一区二区三区| 日本高清一区二区视频| 综合在线观看色| 国产精品久久久久久久免费看 | 国产精品第七页| 亚洲成人午夜影院| 人妻无码一区二区三区久久99| 久久久久久久久久国产| 97久久超碰| 欧美黑人经典片免费观看 | caopeng视频| 欧美午夜性色大片在线观看| 日韩国产福利| 日本国产一区二区三区| 制服丝袜日韩| 美女网站免费观看视频| 欧美极品xxx| 一级片一区二区三区| 久久国产精品网站| 视频亚洲一区二区| 欧美视频免费看欧美视频| av不卡一区二区三区| 99re这里只有精品在线| 在线色欧美三级视频| 亚洲欧洲一二区| 六月婷婷激情综合| 91免费观看视频在线| 不卡av电影在线| 日韩视频第一页| 97品白浆高清久久久久久| 日本www在线播放| 亚洲国产精品成人久久综合一区 | 欧美www视频| 牛牛精品一区二区| 亚洲高清乱码| 国产盗摄女厕一区二区三区| 日本一区二区欧美| 丝袜情趣国产精品| 98视频精品全部国产| 欧美韩国日本在线| 中文字幕一区二区三区av| 天堂中文资源在线观看| 国产精品久久久久久久久久免费| 91精品综合| 好吊一区二区三区视频|