Carl Ambroselli:
J'ai un dataframe avec plusieurs colonnes:
| a | b | c | d |
-----------------
| 0 | 4 | 3 | 6 |
| 1 | 7 | 0 | 4 |
| 2 | 4 | 3 | 6 |
| 3 | 9 | 5 | 9 |
Je voudrais maintenant combiner [b,c,d]
en une seule colonne. Cependant, je ne sais pas, la taille de la liste des colonnes sera , sinon je pourrais utiliser un UDF3 de combiner les trois.
Ainsi, le résultat souhaité est:
| a | combined |
-----------------
| 0 | [4, 3, 6] |
| 1 | [7, 0, 4] |
| 2 | [4, 3, 6] |
| 3 | [9, 5, 9] |
Comment puis-je atteindre cet objectif?
pseudo-code non-travail:
public static Dataset<Row> mergeColumns(Dataset<Row> ds, List<String> columns) {
return ds.withColumn("combined", collectAsList(columns))
}
solution de contournement pire cas serait une instruction switch sur le nombre de colonnes d'entrée, puis écrire un UDF chacun pour, par exemple 2-20 colonnes d'entrée et de jeter une erreur, si plusieurs colonnes d'entrée sont fournis.
Grisha Weintraub:
Comme Ramesh a mentionné dans son commentaire, vous pouvez utiliser la array
fonction. Il vous suffit de convertir vos colonnes liste Column
tableau.
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)))
}