如何将 Sha2 应用于 Hive 或 spark sql 中数组结构形式的特定列?动态地

How to apply Sha2 for a particular column which is inside in the form of array struct in Hive or spark sql? Dynamically

我在 Hive 中有数据

id    name       kyc
1001  smith      [pnno:999,ssn:12345,email:ss@mail.com]

当我们 select 这些列时,输出将是


1001.smith, [999,12345,ss@mail.com]

我必须在此数组列中应用 SHA2,并且输出应显示

1001,smith,[999,*****(sha2 masked value), ss@gmail.com]

输出应该是相同的数组结构格式

我目前正在创建一个单独的视图并加入查询,有什么方法可以在 Hive 查询中或在 spark/scala 内部动态使用数据帧来处理这个问题?

此外,使用任何配置 spark/scala?

谢谢

您可以使用 transform 来加密结构数组中的 ssn 字段:

// sample dataframe
df.show(false)
+----+-----+---------------------------+
|id  |name |kyc                        |
+----+-----+---------------------------+
|1001|smith|[[999, 12345, ss@mail.com]]|
+----+-----+---------------------------+

// sample schema
df.printSchema
// root
// |-- id: integer (nullable = false)
// |-- name: string (nullable = false)
// |-- kyc: array (nullable = false)
// |    |-- element: struct (containsNull = false)
// |    |    |-- pnno: integer (nullable = false)
// |    |    |-- ssn: integer (nullable = false)
// |    |    |-- email: string (nullable = false)

val df2 = df.withColumn(
    "kyc", 
    expr("""
        transform(kyc, 
            x -> struct(x.pnno pnno, sha2(string(x.ssn), 512) ssn, x.email email)
        )
    """)
)

df2.show(false)
+----+-----+------------------------------------------------------------------------------------------------------------------------------------------------------+
|id  |name |kyc                                                                                                                                                   |
+----+-----+------------------------------------------------------------------------------------------------------------------------------------------------------+
|1001|smith|[[999, 3627909a29c31381a071ec27f7c9ca97726182aed29a7ddd2e54353322cfb30abb9e3a6df2ac2c20fe23436311d678564d0c8d305930575f60e2d3d048184d79, ss@mail.com]]|
+----+-----+------------------------------------------------------------------------------------------------------------------------------------------------------+