首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于掩蔽/转换蜂巢中array<<struct>>数据类型的某些属性的单元UDF

用于掩蔽/转换蜂巢中array<<struct>>数据类型的某些属性的单元UDF
EN

Stack Overflow用户
提问于 2021-06-13 13:09:29
回答 1查看 219关注 0票数 1

我需要用Hive中的数组((Struct)数据类型)掩盖列的某些属性。例如,biodata = {'name':'Rahul','age':20,‘性别’:‘male’},{'name':'Kavita','age':25,‘性别’:‘女性’}

在这里,我需要屏蔽/加密'name‘属性并返回数组((Struct))如下:biodata = {'name':'xvdff',’年龄‘:20,’性别‘:’mask‘},{'name':'ddkfld',’年龄‘:25,’性别‘:’女性‘}

我如何通过编写一个Hive来实现这一点。

EN

回答 1

Stack Overflow用户

发布于 2021-06-14 07:35:55

如果您想在不爆炸的情况下这样做,那么您需要编写自定义的UDF。

sha256散列是一种很好的数据混淆方法(在Hive中是sha2(input, 256)函数),因为它是冲突容忍和确定性单向函数。单向表示不可能逆转(密码学上的强),冲突容忍意味着对于不同输入值获取相同哈希的概率很低,而确定性意味着对于相同的输入总是相同的散列,该属性允许您对散列属性执行联接并计算不同的散列值,以其他分析和聚合的方式执行其他分析和聚合,就好像它们没有被删除一样。

使用本机Hive函数,您可以爆炸,应用sha256,然后再收集数组。

例如:

代码语言:javascript
复制
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版本,可以使用reflectjava_methodreflect('org.apache.commons.codec.digest.DigestUtils', 'sha256Hex', input)调用DigestUtils方法。

安全性较低、冲突容忍较低的散列方法是MD5: md5(输入)。

此外,Hive还具有掩蔽数据的mask_hash函数,它基于Hive2.x和更改为在Hive3.0中使用sha256,请参阅代码更改中的MD5,您可以使用该代码,也可以阅读这个关于如何使用在GenericUDF中按指定的结构字段排序数组( struct )的博客,这将给您一个良好的开端,如果您想要自定义的UDF

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67958624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档