IT虾米网

spark sql查询hive表实现脱敏详解

leader 2021年11月03日 大数据 273 0
本文章主要介绍了spark sql查询hive表实现脱敏,具有不错的的参考价值,希望对您有所帮助,如解说有误或未考虑完全的地方,请您留言指出,谢谢!

关于hive表查询脱敏,原理是select的时候在后台对sql进行处理,对每个要查询的字段都加一个自定义的mask脱敏函数。

一开始的实现思路是类似 select col1,col2,col3 from mask_table,后台处理后sql改造成select m.col1,m.col2,m.col3 from (select mask(col1),mask(col2),mask(col3) from mask_table) m , 优点是实现比较简单,根据spark sql执行的物理计划,获取到sql涉及到的根表,对根表的每个字段进行脱敏。

但以上实现存在问题,假设原sql为select mobile from mask_table where mobile=‘13111111111’,通过上述方法改造后,sql变成select mobile from (select mask(mobile) from mask_table) a where mobile=‘13111111111’,当前这种情况已经无法查询结果

最后实现的方式其实一开始就想到了,但是最开始的时候觉得要追溯字段的依赖关系有点不太好弄,所以用了上述方式,不过最后还是改造成了下面的方法:

实现原理一样,也是根据spark sql的物理计划对sql重新进行拼接,不同的是,原来是对根表的每个字段进行脱敏处理,现在对查询结果的每个字段进行脱敏处理。

优点:
1、能根据具体条件查询
2、查询性能相较第一种方式有所提高。

大概实现是:
1、将原始sql改成,sql = “select * from (” + sql + “) m”,原因是用户执行的sql可能会比较复杂,所以在外面又嵌套了一个查询,这样不管原sql多复杂,经过一层嵌套后查询的返回结果字段获取就会比较简单

由于在外面又嵌套了一层查询,所以导致查询有一个缺陷,诸如select a.mobile,b.mobile from tmp_a a left join tmp_b b on a.id=b.id 这样的查询,变成select * from (select a.mobile,b.mobile from tmp_a a left join tmp_b b on a.id=b.id) m后,会报字段名重复的错误

2、根据spark sql的物理计划获得字段的依赖关系

3、重新拼接sql。

val df = sparkSession.sql(sql) 
val query = df.queryExecution 
val sparkPlan = query.sparkPlan  //从这里可以获取到字段的依赖关系 

发布评论
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

centos7环境搭建详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。