Spark Java - Collectionnez plusieurs colonnes dans la colonne de tableau

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 arrayfonction. Il vous suffit de convertir vos colonnes liste Columntableau.

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)))
}

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=188365&siteId=1
conseillé
Classement