我正在尝试学习加密,我想出了以下代码
import java.util.Base64
object JavaCryptoEncryption{
val Algorithm = "AES/CBC/PKCS5Padding"
val IvSpec = new IvParameterSpec(new Array[Byte](16))
def encrypt(text: String, b64secret: String): String = {
val cipher = Cipher.getInstance(Algorithm)
val key = new SecretKeySpec(Base64.getDecoder.decode(b64secret), "AES")
cipher.init(Cipher.ENCRYPT_MODE, key, IvSpec)
new String(Base64.getEncoder.encode(cipher.doFinal(text.getBytes("utf-8"))), "utf-8")
}
def decrypt(text: String, b64secret: String): String = {
val cipher = Cipher.getInstance(Algorithm)
val key = new SecretKeySpec(Base64.getDecoder.decode(b64secret), "AES")
cipher.init(Cipher.DECRYPT_MODE, key, IvSpec)
new String(cipher.doFinal(Base64.getDecoder.decode(text.getBytes("utf-8"))), "utf-8")
}
}在我的系统中的其他地方,我定义并存储密钥。然后,我将JavaCryptoEncryption.encrypt和JavaCryptoEncryption.decrypt应用于字符串值,它可以很好地工作。但是,当我想要将它们转换为UDF并应用于DataFrame的列时,我会得到org.apache.spark.SparkException: Task not serializable。类似的代码(不含iv)适用于AES/ECB/PKCS5Padding.是否某些模式不支持并行?有没有附近的路?或者可能有不同的原因?
发布于 2020-02-26 00:14:54
也许,可以尝试将所有与对象创建相关的代码放在UDF本身中,并仅将键作为UDF参数提供?这样,您将只需要向workers发送一个String,因此应该不会出现序列化问题。
https://stackoverflow.com/questions/60396240
复制相似问题