Hive UDF 屏蔽/转换 Hive 中数组<<struct>> 数据类型的某些属性

问题描述

我需要在 Hive 中用 array((struct)) 数据类型屏蔽列的某些属性。比如一个字段,biodata = [{'name':'Rahul','age':20,'gender':'male'},{'name':'Kavita','age':25,'gender':'female'}]

在这里,我需要屏蔽/加密 'name' 属性并返回 array((struct)) 如下: biodata = [{'name':'xvdff',{'name':'ddkfld','gender':'女'}]

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

解决方法

如果你想做到不爆,那么你需要编写自定义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。

此外,您可能希望将空值或其他“特殊值”设置为 NULL 或空,而不是像这样散列它们:case when name = '' or name = 'NA' then '' else sha2(name,256) end,分析和过滤此类值会更方便。

sha256 的长度是 64 个 HEX 数字,不依赖于输入长度。 'test' 输入字符串示例:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

对于没有原生 sha2 的旧 Hive 版本,您可以使用 reflectjava_method 调用 DigestUtils 方法:reflect('org.apache.commons.codec.digest.DigestUtils','sha256Hex',input)

安全性较低且冲突容忍度较低的散列方法是 MD5:md5(input)。

Hive 也有 mask_hash 函数用于屏蔽数据,它基于 Hive 2.x 中的 MD5changed to use sha256 in Hive 3.0,see code changes,您可以使用该代码并阅读此博客了解如何sort array(struct) by specified struct field in GenericUDF,如果您想要自定义 UDF,这将为您提供一个良好的开端