Carl Ambroselli:
Tengo una trama de datos con múltiples columnas:
| a | b | c | d |
-----------------
| 0 | 4 | 3 | 6 |
| 1 | 7 | 0 | 4 |
| 2 | 4 | 3 | 6 |
| 3 | 9 | 5 | 9 |
Ahora me gustaría combinar [b,c,d]
en una sola columna. Sin embargo, no sé, cuán grande es la lista de las columnas será , por lo demás tan sólo pudiera utilizar un UDF3 combinar los tres.
Por lo que el resultado deseado es:
| a | combined |
-----------------
| 0 | [4, 3, 6] |
| 1 | [7, 0, 4] |
| 2 | [4, 3, 6] |
| 3 | [9, 5, 9] |
¿Cómo puedo conseguir esto?
Que no trabajan pseudo-código:
public static Dataset<Row> mergeColumns(Dataset<Row> ds, List<String> columns) {
return ds.withColumn("combined", collectAsList(columns))
}
Peor de los casos solución sería una sentencia switch en el número de columnas de entrada y luego escribir una UDF para cada uno, es decir, 2-20 columnas de entrada y generar un error, si se suministran más columnas de entrada.
Grisha Weintraub:
Como Ramesh mencionó en su comentario, puede utilizar array
la función. Sólo es necesario para convertir su lista de columnas de Column
la matriz.
public static Dataset<Row> mergeColumns(Dataset<Row> ds, List<String> columns) {
return ds.withColumn("combined", functions.array(columns.stream().map(functions::col).toArray(Column[]::new)))
}