Searching...
viernes, 9 de junio de 2023

Generador de ficheros en S3

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.

 
Back to top!