我需要用Hive中的数组((Struct)数据类型)掩盖列的某些属性。例如,biodata = {'name':'Rahul','age':20,‘性别’:‘male’},{'name':'Kavita','age':25,‘性别’:‘女性’}
在这里,我需要屏蔽/加密'name‘属性并返回数组((Struct))如下:biodata = {'name':'xvdff',’年龄‘:20,’性别‘:’mask‘},{'name':'ddkfld',’年龄‘:25,’性别‘:’女性‘}
我如何通过编写一个Hive来实现这一点。
发布于 2021-06-14 07:35:55
如果您想在不爆炸的情况下这样做,那么您需要编写自定义的UDF。
sha256散列是一种很好的数据混淆方法(在Hive中是sha2(input, 256)函数),因为它是冲突容忍和确定性单向函数。单向表示不可能逆转(密码学上的强),冲突容忍意味着对于不同输入值获取相同哈希的概率很低,而确定性意味着对于相同的输入总是相同的散列,该属性允许您对散列属性执行联接并计算不同的散列值,以其他分析和聚合的方式执行其他分析和聚合,就好像它们没有被删除一样。
使用本机Hive函数,您可以爆炸,应用sha256,然后再收集数组。
例如:
select t.id,
collect_list(named_struct('name', sha2(e.name, 256), 'age', e.age, 'gender', e.gender)) as result_array
from mytable t
lateral view outer inline(t.biodata) e as name, age, gender
group by t.id在数据仓库中的所有数据中应用sha256仍然可以通过哈希值进行分析和连接,尽管在没有原始值->哈希映射的情况下不可能逆转sha256。
此外,您可能希望将空值或其他“特殊值”设置为空值或空值,而不是像这样散列它们:case when name = '' or name = 'NA' then '' else sha2(name, 256) end,分析和过滤这些值将更加方便。
sha256的长度为64 HEX位数,不依赖于输入长度。“测试”输入字符串示例:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
对于没有本机sha2的旧Hive版本,可以使用reflect或java_method:reflect('org.apache.commons.codec.digest.DigestUtils', 'sha256Hex', input)调用DigestUtils方法。
安全性较低、冲突容忍较低的散列方法是MD5: md5(输入)。
此外,Hive还具有掩蔽数据的mask_hash函数,它基于Hive2.x和更改为在Hive3.0中使用sha256,请参阅代码更改中的MD5,您可以使用该代码,也可以阅读这个关于如何使用在GenericUDF中按指定的结构字段排序数组( struct )的博客,这将给您一个良好的开端,如果您想要自定义的UDF
https://stackoverflow.com/questions/67958624
复制相似问题