04/02/2022

Java + Spark + Broadcast

Para evitar tener que enviar por red información a las funciones de transformación en repetidas ocasiones existe una manera meter esa información «en sesión» para que sea accesible por todos los nodos/executors sin la necesidad de que sea enviada repetidamente.

Es necesario que esta información no varíe, porque de variar, no tendríamos los cambios realizados tras la creación del Broadcast.

JavaSparkContext jsc = JavaSparkContext.fromSparkContext(sparkSession.sparkContext());

Broadcast<HashMap> negocio = jsc.broadcast(map2);

JavaRDD<Row> rdd = dsData.javaRDD().map(new MappingData(negocio));

El constructor de la clase MappingData tendrá como atributo de la clase un objeto del tipo Broadcast

public MappingData(Broadcast<HashMap> negocio) {

Para acceder al contenido de dicho objeto se hará así

List<Row> ls = (List<Row>) negocio.getValue().get(id);