如何将 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]]|
+----+-----+------------------------------------------------------------------------------------------------------------------------------------------------------+
我在 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]]|
+----+-----+------------------------------------------------------------------------------------------------------------------------------------------------------+