Spark Java - recoger múltiples columnas en columna de matriz

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 arrayla función. Sólo es necesario para convertir su lista de columnas de Columnla 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)))
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=188367&siteId=1
Recomendado
Clasificación