Spark?實現(xiàn)自定義加密的示例代碼
更新時間:2024年07月18日 14:31:38 作者:Byyyi耀
這篇文章主要介紹了Spark?實現(xiàn)自定義加密的示例代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
Spark 實現(xiàn)自定義加密
一、建立加密和解密的自定義函數(shù)
import java.nio.charset.{StandardCharsets}
import java.util.Base64
import javax.crypto.Cipher
import javax.crypto.spec.SecretKeySpec
object SparkUtil {
/**
* 處理密鑰
* @param secret 密鑰
*/
private def secretInit(secret:String)={
// 對密鑰長度進行約束
val allowNumBits: Array[Int] = Array(16, 24, 32)
// 如果密鑰長度符合,將密鑰轉(zhuǎn)換為AES密鑰對象
if (allowNumBits.contains(secret.size)) {
new SecretKeySpec(
secret.getBytes(StandardCharsets.UTF_8),"AES")
}else{
throw new RuntimeException(
s"AES secret size of numBits ${secret.size} not in
permitted values (${allowNumBits.mkString(",")})")
}
}
/**
* 加密函數(shù)
* @param src 源數(shù)據(jù)
* @param secret 密鑰
*/
def encrypt(src:String,secret:String)={
// 獲取加密算法實例
val cipher: Cipher = Cipher.getInstance("AES")
// 初始化加密模式,使用給定的密鑰(需要先用key()對密鑰進行處理)
cipher.init(Cipher.ENCRYPT_MODE,secretInit(secret))
// 執(zhí)行加密操作
val bytes: Array[Byte] = cipher.doFinal(src.getBytes(StandardCharset.UTF_8))
// 返回加密后的數(shù)據(jù)
Base64.getEncoder().encodeToString(bytes)
}
/**
* 解密函數(shù)
* @param dest 待解密數(shù)據(jù)
* @param secret 密鑰
*/
def decrypt(dest:String,secret:String)={
val cipher: Cipher = Cipher.getInstance("AES")
cipher.init(Cipher.DECRYPT_MODE,secretInit(secret))
val bytes: Array[Byte] = cipher.doFinal(
Base64.getDecoder.decode(dest))
new String(bytes, StandardCharsets.UTF_8)
}
}二、在 Spark 環(huán)境下導入對象實現(xiàn)的方法,并在 SparkSession 中注冊 UDF 函數(shù)
import core.SparkUtil.{encrypt,decrypt}
spark.udf.register(
"aes_encrypt",
(src:String,secret:String)
=>encrypt(src, secret),StringType)
spark.udf.register(
"aes_decrypt",
(src:String,secret:String)
=>decrypt(src, secret),StringType)三、在SparkSQL中調(diào)用函數(shù)
val frm: DataFrame = spark.createDataFrame(Seq(
Test(1,Array("money","freedom"),Map("java"->85,"mysql"->67)),
Test(2,Array("beauty","beauty"),Map("java"->72,"mysql"->90)),
Test(3,Array("sports","beauty"),Map("java"->76,"html"->52))
))
val secret = "henryyb2211ariel"
val frmEncrypt: DataFrame = frm
.select($"id",
callUDF(
"aes_encrypt",
array_join($"hobbies", ","),
lit(secret)
).as("encrypted_hobbies")
)
val frmDecrypt: DataFrame = frmEncrypt
.select($"id",
split(
callUDF(
"aes_decrypt",
$"encrypted_hobbies",
lit(secret)
),
","
).as("hobbies")
).show()到此這篇關于Spark 實現(xiàn)自定義加密的文章就介紹到這了,更多相關Spark 自定義加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springmvc用于方法鑒權(quán)的注解攔截器的解決方案代碼
這篇文章主要介紹了springmvc用于方法鑒權(quán)的注解攔截器的解決方案代碼,具有一定借鑒價值,需要的朋友可以參考下。2017-12-12
java Nio使用NioSocket客戶端與服務端交互實現(xiàn)方式
這篇文章主要介紹了java Nio使用 NioSocket 客戶端與服務端交互實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
如何讓@EnableConfigurationProperties的值注入到@Value中
這篇文章主要介紹了如何讓@EnableConfigurationProperties的值注入到@Value中的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-06-06
SpringBoot2.2.X用Freemarker出現(xiàn)404的解決
這篇文章主要介紹了SpringBoot2.2.X用Freemarker出現(xiàn)404的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02
Maven中<distributionManagement>的使用及說明
本文主要介紹了Maven中的SNAPSHOT和RELEASE倉庫的區(qū)別,以及如何在POM文件中配置和使用快照版本,快照版本可以實現(xiàn)實時更新,方便開發(fā)過程中的依賴管理,同時,本文還總結(jié)了Maven的一些常用命令及其作用2025-01-01

