欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spark?實現(xiàn)自定義加密的示例代碼

 更新時間:2024年07月18日 14:31:38   作者:Byyyi耀  
這篇文章主要介紹了Spark?實現(xiàn)自定義加密的示例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧

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)={
    // 對密鑰長度進(jìn)行約束
    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()對密鑰進(jìn)行處理)
    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)境下導(dǎo)入對象實現(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()

到此這篇關(guān)于Spark 實現(xiàn)自定義加密的文章就介紹到這了,更多相關(guān)Spark 自定義加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論