Comment agréger les valeurs dans la collection après groupBy?
J'ai un dataframe avec le schéma en tant que tel:
[visitorId: string, trackingIds: array<string>, emailIds: array<string>]
La recherche d'un moyen pour le groupe (ou peut-être cumulatif?) cette dataframe par visitorid où la trackingIds et emailIds colonnes voudrais ajouter ensemble. Si par exemple ma première df ressemble:
visitorId |trackingIds|emailIds
+-----------+------------+--------
|a158| [666b] | [12]
|7g21| [c0b5] | [45]
|7g21| [c0b4] | [87]
|a158| [666b, 777c]| []
Je voudrais que mon sortie df à ressembler à ce
visitorId |trackingIds|emailIds
+-----------+------------+--------
|a158| [666b,666b,777c]| [12,'']
|7g21| [c0b5,c0b4] | [45, 87]
De tenter de l'utiliser groupBy
et agg
opérateurs, mais ne pas avoir beaucoup de chance.
Vous devez vous connecter pour publier un commentaire.
Spark >= 2.4
Vous pouvez remplacer
flatten
udf
avec construit-dansaplatir l'
functionen laissant le reste comme elle est.
Spark >= 2.0, < 2.4
C'est possible, mais assez cher. En utilisant les données que vous avez fournies:
et une fonction d'assistance:
nous pouvons remplir les espaces vides avec des espaces réservés:
collect_lists
etflatten
:Avec statiquement typé
Dataset
:Étincelle 1.x
Vous pouvez convertir le RDD et le groupe
trackingIds
?size(f(x, y)) = size(x) + size(y)
, le coût de l'agrégation (et répétée de la copie de données) sera l'emportent largement sur les avantages de la carte du côté de la réduction, dans presque tous les cas.@zero323 la réponse est assez très complet, mais l'Étincelle nous donne encore plus de flexibilité. Comment au sujet de la solution suivante?
Qui cependant laisse de côté toutes les collections vide (donc il y a de la place pour l'amélioration :))
explode
opérateur etexplode
fonction. B) éventuellement.Vous pouvez utiliser défini par l'Utilisateur agrégées fonctions.
1) créer un personnalisé udaf, nous à l'aide de la scala de classe appelé customAggregation.
2) Puis utiliser l'udaf, nous, dans votre code comme
UserDefinedAggregateFunctions
complexe, avec des tampons.