日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

kylin与superset集成实现数据可视化

發布時間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 kylin与superset集成实现数据可视化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文地址:http://minirick.duapp.com/kylinyu-supersetji-cheng-shi-xian-shu-ju-ke-shi-hua/?utm_source=tuicool&utm_medium=referral

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

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

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

我廠也是選擇了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數據源,成功! 導入kylin數據源 但是點開sqllab想敲點sql驗證一下時,卻出了異常。 異常 Debug了pykylin代碼,發現get_table_names方法的入參connection實際已經是sqlalchemy的Engine對象了,這可能是最新sqlalchemy的版本升級造成的。總之,將原來的代碼:

def get_table_names(self, connection, schema=None, **kw):
return connection.connection.list_tables()
改成:

def get_table_names(self, engine, schema=None, **kw):
connection = engine.contextual_connect()
return connection.connection.list_tables()
即可。

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

def list_schemas(self):
route = ‘tables_and_columns’
params = {‘project’: self.project}
tables = self.proxy.get(route, params=params)
return [t[‘table_SCHEM’] for t in tables]
dialect.py添加:

def get_schema_names(self, engine, schema=None, **kw):
connection = engine.contextual_connect()
return connection.connection.list_schemas()
之后執行sql還是有錯: 異常 pykylin在每次調用kylin的api時會首先登錄,以獲得JSESSIONID,并存入cookie中,這里是登錄失敗,檢查代碼,發現這里問題還挺多的,首先proxy.py中的login方法作者寫的是self.password = user應改成password。dialect.py中create_connect_args方法改為:

def create_connect_args(self, url):
opts = url.translate_connect_args()
api_prefix = ‘kylin/api/’
args = {
‘username’: opts[‘username’],
‘password’: opts[‘password’],
‘endpoint’: ‘http://%s:%s/%s’ % (opts[‘host’], opts[‘port’], api_prefix)
}
args.update(url.query)
return [], args
這樣大部分sql查詢沒有問題,但是有的查詢結果有部分值是null,這樣也會出錯。修改cursor.py的_type_mapped方法:

def _type_mapped(self, result):
meta = self.description
size = len(meta)
for i in range(0, size):
column = meta[i]
tpe = column[1]
val = result[i]
if val is None:
pass
elif tpe == ‘DATE’:
val = parser.parse(val)
elif tpe == ‘BIGINT’ or tpe == ‘INT’ or tpe == ‘TINYINT’:
val = int(val)
elif tpe == ‘DOUBLE’ or tpe == ‘FLOAT’:
val = float(val)
elif tpe == ‘BOOLEAN’:
val = (val == ‘true’)
result[i] = val
return result
這樣在sqllab中執行sql基本沒問題了。 sqllab

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

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

@property def sqla_col(self):name = self.metric_nameif name == 'count':name = 'total_count'return literal_column(self.expression).label(name)

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

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

def execute(self, operation, parameters={}, acceptPartial=True, limit=None, offset=0):
sql = operation % parameters
data = {
‘sql’: sql,
‘offset’: offset,
‘limit’: limit or self.connection.limit,
‘acceptPartial’: acceptPartial,
‘project’: self.connection.project
}
logger.debug(“QUERY KYLIN: %s” % sql)
resp = self.connection.proxy.post(‘query’, json=data)

column_metas = resp['columnMetas']for c in column_metas:c['label'] = str(c['label']).lower()c['name'] = str(c['name']).lower()self.description = [[c['label'], c['columnTypeName'],c['displaySize'], 0,c['precision'], c['scale'], c['isNullable']]for c in column_metas]self.results = [self._type_mapped(r) for r in resp['results']]self.rowcount = len(self.results)self.fetched_rows = 0return self.rowcount

最后,我發現在查找的字段包含kylin中的date類型時也會出錯。點擊slice頁面右上角的query按鈕,可以查看superset最終發送的sql。 kylin不支持的長日期格式 將它直接拷貝到kylin的insight頁面去執行,發現報錯。原來kylin的date類型只支持年月日,而superset在添加日期搜索條件時為了實現定時刷新圖表而在sql的日期條件中都精確到了時分秒。關于這個我原先是在superset中做了修改。

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

time_filter = dttm_col.get_time_filter(from_dttm, to_dttm)
改為

if engine.name == ‘kylin’:
time_filter = dttm_col.get_date_filter(from_dttm, to_dttm)
else:
time_filter = dttm_col.get_time_filter(from_dttm, to_dttm)
添加get_date_filter,dt_sql_literal函數:

def get_date_filter(self, start_dttm, end_dttm):
col = self.sqla_col.label(‘__time’)
return and_(
col >= text(self.dt_sql_literal(start_dttm)),
col <= text(self.dt_sql_literal(end_dttm)),
)

def dt_sql_literal(self, dttm):
return “’{}’”.format(dttm.strftime(‘%Y-%m-%d’))
這樣對于所有kylin數據源的查找時間范圍條件都將轉為年月日的格式。

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

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

然后可以看到slice這里sql中的該列都變成了to_date函數形式 to_date sql 最后的工作就是修改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)等。日期轉換函數的處理放在這后面我覺得是最合適的。

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

private static final String TO_DATE = “(to_date|TO_DATE)\(‘|\”[‘|\”],\s?‘|\”[‘|\”]\)”;
private static final Pattern FN_TO_DATE = Pattern.compile(TO_DATE);
添加日期轉行函數解析:

private String executeFN(String sql) {
Matcher m;
while (true) {
m = FN_TO_DATE.matcher(sql);
if (!m.find())
break;
String dateTime = m.group(2);
String format = m.group(3);
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
Date dt = null;
try {
dt = sdf.parse(dateTime);
} catch (ParseException e) {
logger.error(“Parse date error”, e);
}
sdf = new SimpleDateFormat(format);
String date = sdf.format(dt);
String begin = sql.substring(0, m.start());
String end = sql.substring(m.end(), sql.length());
sql = begin + “’” + date + “’” + end;
}
return sql;
}
然后kylin就可以支持上面sql的執行了 kylin支持to_date 最后,讓我們多嘗試一些可視化圖表吧,把它們做成dashboard superset dashboard

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

總結

以上是生活随笔為你收集整理的kylin与superset集成实现数据可视化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 九色91av | 免费乱淫视频 | 欧洲av无码放荡人妇网站 | 国产高清精品一区二区三区 | 高清日韩av | 少妇做爰免费视看片 | 免费一级片网址 | 精品欧美一区二区在线观看 | 久久精品视频观看 | 张津瑜国内精品www在线 | 婷婷激情成人 | 亚洲污片| 欧美性猛交xxxx偷拍洗澡 | 亚洲一卡二卡三卡四卡 | 国产青青在线 | 欧美激情三级 | 国产亚洲色婷婷久久99精品 | 少妇做爰免费视看片 | 香蕉视频在线看 | 午夜精品一区二区三 | 国产在线视频自拍 | 亚洲精品乱码久久久久99 | 99国产精品久久久久久久成人热 | 久久爱综合网 | 丰满少妇高潮在线观看 | 99视频热| 在线观看av片 | 一级片免费观看视频 | 一区二区三区丝袜 | 中文字幕婷婷 | 性生生活大片又黄又 | 花房姑娘免费全集 | 国产一区第一页 | 国产激情啪啪 | 亚洲一卡二卡在线观看 | 乱子伦一区 | 99久久精品日本一区二区免费 | 国产激情视频一区二区 | 天天色天天操天天 | 大桥未久恸哭の女教师 | 伊人伦理 | 亚洲精品www久久久久久 | 你懂的日韩 | 日本在线不卡一区 | av在线网址大全 | 色婷婷热久久 | 怡红院av在线 | 超碰一区二区三区 | 91精品观看 | 精品国产丝袜一区二区三区乱码 | 午夜嘿嘿| 香蕉视频最新网址 | 日本精品在线看 | 鲁一鲁啪一啪 | 欧美视频直播网站 | 欧美成人播放 | 全部免费毛片在线播放一个 | 在线看国产 | 欧美第一视频 | 香蕉成视频人app下载安装 | 男插女视频在线观看 | 国产精品无码中文字幕 | 国产精品久久久久影院老司 | 久久精彩免费视频 | 日本视频在线观看 | 精品人妻一区二区三区久久 | youjizz.com中国| 中文在线观看视频 | 欧美色图在线播放 | 黄色工厂在线观看 | 中文字幕乱码在线人视频 | 在线看一区二区 | 欧美日本一区二区 | 成年人在线视频 | 中国男女全黄大片 | 啪啪网站免费观看 | 在线观看亚洲av每日更新 | 一区二区三区日韩电影 | 男女视频在线 | 九九热精品在线 | 奇米777色 | 一区二区三区www污污污网站 | 91丨国产丨白丝 | 亚洲午码 | 福利视频网站 | 日韩久久久精品 | 亚洲中文字幕一区 | 国产99999 | 亚洲一区二区在线电影 | 色久阁| 中文字幕一区不卡 | 国产拍拍拍拍拍拍拍拍拍拍拍拍拍 | 精品精品精品 | 99国内揄拍国内精品人妻免费 | 在线观看涩涩视频 | 奇米影视第四色首页 | 日韩av手机在线 | 激情成人综合 | 国毛片 |