#scala #apache-spark
#scala #apache-spark
Вопрос:
У меня есть файл, зашифрованный с помощью симметричного алгоритма AES128. Как настроить в spark для декодирования файла?
Я попытался загрузить файл, как показано ниже, а затем вызвать пользовательскую функцию для дешифрования. Но дешифрование всегда завершается неудачей. Похоже, что зашифрованное двоичное содержимое каким-то образом изменяется после загрузки через spark. Как этого избежать?
val dec = spark.sparkContext.textFile("inputFile")
dec.coalesce(1, shuffle=true).saveAsTExtFile("path")
Исключение при расшифровке файла сохранения
Input length must be multiple of 16 when decrypting with padded cipher
java.lang.SecurityException: Input length must be multiple of 16 when decrypting with padded cipher
Ответ №1:
Насколько я знаю, у самой Spark нет API для дешифрования, поэтому вам придется выполнять построчную (или ячейку за ячейкой в случае dataframes) расшифровку.
С точки зрения кода вы можете сделать что-то вроде приведенного ниже,
Предполагая текстовый файл из примера,
val sparkSession = ???
import sparkSession.implicits._
// Read text file as data set
val df = sparkSession.read.text("/path/to/files/").as[String]
// Create UDF for decryption
import org.apache.spark.sql.functions.udf
import org.apache.spark.sql.expressions.UserDefinedFunction
def decrypt_text: UserDefinedFunction = {
udf((str: String) => {
// Decryption logic
})
}
// Use UDF to decrypt
val decDF = df.withColumn("decrpytedText", decrypt_text(col("value")))
// View results
decDF.show(false)
Комментарии:
1. как расшифровать весь файл, а не строку за строкой?
2. После расшифровки значением может быть CSV, JSON, XML (или даже двоичный контент, такой как Avro или Parquet). Как вы разбиваете весь файл данных на отдельные записи, используя Spark, так же, как это было бы с spark.read.csv или spark.read.avro и т. Д.?
3. @Minisha, вы должны использовать RDD с SparkContext.binaryFiles() или использовать фрейм данных с spark.read.format(«Двоичный файл»).load