hemos utilizado las clases y métodos de la SDK 2 de AWS, como S3Client
y PutObjectRequest
, para crear un cliente S3 y construir la solicitud de putObject
. Además, hemos utilizado RequestBody.fromString
para convertir el contenido del fichero a un objeto de solicitud de cuerpo.
En este código, hemos creado un trait llamado S3FileWriter
que define el método writeContent
. Este método acepta el nombre del bucket, la clave S3 y las líneas del fichero a escribir. Dentro del método, se instancia el cliente S3 y se realiza la llamada a putObject
para escribir el contenido en S3.
La clase FileGenerator
ahora extiende el trait S3FileWriter
y utiliza el método writeContent
para escribir el contenido de cada fichero en S3.
De esta manera, el código se ha modularizado y reutilizado mediante el uso de traits en Scala.
hemos creado un objeto singleton FileLinesMap
que encapsula la estructura del mapa mutable linesMap
. Hemos agregado un método addLine
que añade dinámicamente las líneas a medida que aparecen. El método verifica si la clave ya existe en el mapa, y si es así, actualiza la lista de líneas agregando la nueva línea. Si la clave no existe, se agrega una nueva entrada al mapa con la primera línea del fichero en el valor.
La clase FileGenerator
ahora utiliza el objeto FileLinesMap
para agregar dinámicamente las líneas de los ficheros. Al final, se obtiene el mapa de líneas y se escribe el contenido en S3 utilizando el método writeContent
.
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider import software.amazon.awssdk.core.sync.RequestBody import software.amazon.awssdk.regions.Region import software.amazon.awssdk.services.s3.S3Client import software.amazon.awssdk.services.s3.model.PutObjectRequest import java.nio.charset.StandardCharsets
import scala.collection.mutable.{Map => MutableMap}
object FileLinesMap {
private val linesMap: MutableMap[String, List[String]] = MutableMap.empty
def addLine(s3Key: String, line: String): Unit = {
val updatedLines = linesMap.getOrElse(s3Key, Nil) :+ line
linesMap.put(s3Key, updatedLines)
}
def getLinesMap: MutableMap[String, List[String]] = linesMap
}
trait S3FileWriter {
def writeContent(bucketName: String, s3Key: String, lines: List[String]): Unit = { val s3Client: S3Client = S3Client.builder() .region(Region.US_EAST_1) .credentialsProvider(DefaultCredentialsProvider.create()) .build() val fileContent = lines.mkString("\n") val putObjectRequest = PutObjectRequest.builder() .bucket(bucketName) .key(s3Key) .build() s3Client.putObject(putObjectRequest, RequestBody.fromString(fileContent, StandardCharsets.UTF_8)) }
}
object FileGenerator extends S3FileWriter {
def main(args: Array[String]): Unit = {
val bucketName = "nombre-del-bucket"
val s3Keys = List("ruta/fichero1.csv", "ruta/fichero2.csv", "ruta/fichero3.csv")
// Agrega las líneas generadas al mapa dinámicamente
FileLinesMap.addLine("ruta/fichero1.csv", "Línea 1 del fichero 1")
FileLinesMap.addLine("ruta/fichero1.csv", "Línea 2 del fichero 1")
FileLinesMap.addLine("ruta/fichero2.csv", "Línea 1 del fichero 2")
FileLinesMap.addLine("ruta/fichero2.csv", "Línea 2 del fichero 2")
FileLinesMap.addLine("ruta/fichero2.csv", "Línea 3 del fichero 2")
FileLinesMap.addLine("ruta/fichero3.csv", "Línea 1 del fichero 3")
FileLinesMap.addLine("ruta/fichero3.csv", "Línea 2 del fichero 3")
FileLinesMap.addLine("ruta/fichero3.csv", "Línea 3 del fichero 3")
FileLinesMap.addLine("ruta/fichero3.csv", "Línea 4 del fichero 3")
// Obtiene el mapa de líneas
val fileLinesMap = FileLinesMap.getLinesMap
// Escribe el contenido en Amazon S3 para cada fichero
fileLinesMap.foreach { case (s3Key, lines) =>
writeContent(bucketName, s3Key, lines)
}
}
}
0 comentarios:
Publicar un comentario
Gracias por participar en esta página.