【问题标题】:Hive UDF to mask/transform certain attributes of an array<<struct>> data type in HiveHive UDF 以屏蔽/转换 Hive 中数组<<struct>> 数据类型的某些属性
【发布时间】:2021-08-29 16:09:50
【问题描述】:

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

在这里,我需要屏蔽/加密“名称”属性并返回数组((结构)),如下所示: biodata = [{'name':'xvdff','age':20,'gender':'male'},{'name':'ddkfld','age':25,'gender':'女性'}]

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

【问题讨论】:

    标签: arrays struct hive user-defined-functions masking


    【解决方案1】:

    如果你想做到不爆炸,那么你需要编写自定义UDF。

    sha256 hash 是一种很好的数据混淆方法(在 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,给你一个好的开始

    【讨论】:

    • 感谢您的宝贵帮助。但重点/期望更多的是如何将数组>作为参数传递给配置单元UDF并返回一个数组>,其中隐藏了特定的字段。请让我知道如何实现一样。
    • @AbhishekGupta 在最后一个链接 UDF 接收 Array 并返回 ArrayStruct 进行了详细描述,您只需要实现自己的评估方法并删除所有不必要的东西:比较器,排序。跨度>
    猜你喜欢
    • 2021-11-15
    • 1970-01-01
    • 2013-06-12
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    相关资源
    最近更新 更多