13/11/2019

Recuperar parte de las columnas de un DataFrame en Java

La principal peculiaridad de este caso es que las columnas son variables. Es decir, el grupo de columnas que queremos recuperar del DataFrame global se puede configurar dinámicamente, ya sea a través de un fichero de properties o de cualquier otro modo.

La lectura del fichero de properties del proyecto…, en este caso el properties irá dentro del jar del proyecto, pero dejarlo fuera permitirá que sea modificable de una manera mucho más sencilla (y peligrosa también)

try {

	InputStream is = MyClass.class.getResourceAsStream("/com/things/principal/".concat(Constants.PROPERTIES_FILE_NAME.replace("${env}", ENV)));
	Properties prop = new Properties();

	prop.load(is);

	// Comprobamos si la property está en el fichero de configuración antes de leerla
	if (prop.containsKey(Constants.STATIC_FIELD_NAMES)){
		// la property es un literal como este: columna_1:tipo_de_dato, columna_2:tipo_de_dato, columna_3:tipo_de_dato..... 
		setStaticColumns(prop.getProperty(Constants.STATIC_FIELD_NAMES).split(",");
	}else{
		logger.error("No se encuentra la property: STATIC.FIELD.NAMES en el fichero de properties");
		System.exit(-1);
	}
} catch (Throwable e) {

	e.printStackTrace();
	logger.error("ERROR al cargar el fichero de configuracion de properties : ".concat(Constants.PROPERTIES_FILE_NAME.replace("${env}", ENV)));
}	

Tras recuperar la información de los properties la tratamos como sea necesaria, y a partir del listado de nombres de columnas ya podemos trabajar contra el DataFrame.

// trasladamos del List de nombres a un String[] los nombres de las columnas
String[] array = new String[listaNombresColumnas.size()];
for( int i = 0; i<listaNombresColumnas.size(); i++ ) {
	array[i] = listaNombresColumnas.get(i);
}

DataFrame dfStatic = null;
try {

	// aquí tenemos en df el DataFrame del que queremos recuperar sólo algunas de las columnas con información

	dfStatic = df.select(array[0], Arrays.copyOfRange(array, 1, array.length));

	// lo que hacemos es seleccionar la información del DataFrame desde la columna que corresponde a la primera posición del array de nombres y a continuación desde la segunda posición hasta el tamaño del array de nombres. Lo cual cubre todas las posiciones del listado de nombres y nos devolverá en dfStatic las columnas que queremos

}catch(Throwable e) {
	logger.error(e.getMessage());
	e.printStackTrace();

}