SQL Pivot: Conversion de lignes en colonnes

Essayez ce notebook dans Databricks

MISE À JOUR 11/10/2018

Pivot a été introduit pour la première fois dans Apache Spark 1.6 en tant que nouvelle fonctionnalité DataFrame qui permet aux utilisateurs de faire pivoter une expression table en transformant les valeurs uniques d’une colonne en colonnes individuelles.

La version Apache Spark 2.4 étend également cette puissante fonctionnalité de pivotement des données à nos utilisateurs SQL. Dans ce blog, en utilisant des enregistrements de températures à Seattle, nous montrerons comment nous pouvons utiliser cette fonctionnalité SQL Pivot commune pour réaliser des transformations de données complexes.

Examiner les températures estivales avec Pivot

Cet été à Seattle, les températures ont atteint des niveaux inconfortables, atteignant un maximum de 80 et 90 degrés pendant neuf jours en juillet.

Date Température (° F)
22/07/2018 86
23/07/2018 90
24/07/2018 91
25/07/2018 92
26/07/2018 92
27/07/2018 88
28/07/2018 85
29/07/2018 94
30/07/2018 89

Supposons que nous voulions explorer ou examiner s’il y avait un tren historique d dans l’augmentation des niveaux de mercure. Une façon intuitive d’examiner et de présenter ces chiffres consiste à avoir des mois comme colonnes, puis les sommets moyens mensuels de chaque année sur une seule ligne. De cette façon, il sera facile de comparer les températures à la fois horizontalement, entre des mois adjacents et verticalement, entre différentes années.

Maintenant que nous avons le support de la syntaxe PIVOT dans Spark SQL, nous pouvons y parvenir avec la requête SQL suivante.

La requête ci-dessus produira un résultat comme:

Eh bien, on dirait qu’il y a de bonnes et de mauvaises années. L’année 2016 semble plutôt économe en énergie.

Pivoter dans SQL

Examinons cette requête de plus près pour comprendre son fonctionnement. Tout d’abord, nous devons spécifier la clause FROM, qui est l’entrée du pivot, c’est-à-dire la table ou la sous-requête sur laquelle le pivotement sera effectué. Dans notre cas, nous sommes préoccupés par les années, les mois et les températures élevées, ce sont donc les champs qui apparaissent dans la sous-requête.

Deuxièmement, considérons une autre partie importante de la requête, la clause PIVOT. Le premier argument de la clause PIVOT est une fonction d’agrégation et la colonne à agréger. Nous spécifions ensuite la colonne pivot dans la sous-clause FOR comme deuxième argument, suivie de l’opérateur IN contenant les valeurs de la colonne pivot comme le dernier argument.

La colonne pivot est le point autour duquel la table sera tournée, et les valeurs de la colonne pivot seront transposées en colonnes dans la table de sortie. La clause IN vous permet également de spécifier un alias pour chaque valeur de pivot, ce qui facilite la génération de noms de colonnes plus significatifs.

Une idée importante à propos du pivot est que il effectue une agrégation groupée basée sur une liste de colonnes group-by implicites avec la colonne pivot. Les colonnes implicites group-by sont des colonnes de la clause FROM qui n’apparaissent dans aucune fonction d’agrégation ou en tant que colonne pivot.

Dans la requête ci-dessus, la colonne pivot étant le mois de la colonne et la colonne implicite group-by étant l’année de la colonne, l’expression avg(temp) sera agrégé sur chaque paire de valeurs distinctes de (year, month), où le mois est égal à l’une des valeurs de colonne pivot spécifiées. En conséquence, chacune de ces valeurs agrégées sera mappée dans sa cellule correspondante de la ligne year et column mois.

Il convient de noter qu’en raison de ce group-by implicite, nous devons nous assurer que toute colonne que nous ne souhaitons pas faire partie de la sortie du pivot doit être exclue de la FROM, sinon la requête produirait des résultats indésirables.

Spécification de plusieurs expressions agrégées

L’exemple ci-dessus montre qu’une seule expression agrégée est utilisée dans la clause PIVOT, alors qu’en fait, les utilisateurs peuvent spécifier plusieurs expressions d’agrégation si nécessaire. Encore une fois, avec les données météorologiques ci-dessus, nous pouvons lister les températures maximales élevées ainsi que les températures moyennes élevées entre juin et septembre.

En cas d’expressions agrégées multiples, les colonnes seront le produit cartésien du pivot les valeurs de colonne et les expressions agrégées, avec les noms <value>_<aggExpr>.

Regroupement des colonnes et des colonnes pivotantes

Supposons maintenant que nous souhaitons inclure les basses températures dans notre exploration des tendances de température à partir de ce tableau des basses températures quotidiennes:

Date Temp (° F)
08-01-2018 59
08-02-2018 58
03/08/2018 59
04/08/2018 58
05/08/2018 59
06/08/2018 59

Pour combiner ce tableau avec le tableau précédent des températures maximales quotidiennes, nous pourrions joindre ces deux tableaux dans la colonne « Date ». Cependant, puisque nous allons utiliser pivot, qui effectue le regroupement sur les dates, nous peut simplement concaténer les deux tables en utilisant UNION ALL. Et vous verrez plus tard, cette approche nous offre également plus de flexibilité:

Essayons maintenant notre requête pivot avec le nouveau tableau combiné:

En conséquence, nous obtenons le maximum moyen et le minimum moyen pour chaque mois des 4 dernières années dans un seul tableau. Notez que nous devons inclure la colonne flag dans la requête pivot, sinon l’expression avg(temp) serait basée sur un mélange de haut et de bas

Vous avez peut-être remarqué que nous avons maintenant deux lignes pour chaque année, une pour les températures élevées et l’autre pour les températures basses. C’est parce que nous avons inclus une colonne supplémentaire, flag, dans l’entrée pivot, qui à son tour devient une autre colonne de regroupement implicite en plus de la colonne d’origine year.

Alternativement, au lieu d’être une colonne de regroupement, la flag peut également servir de colonne pivot. Nous avons donc maintenant deux colonnes pivot, month et flag:

Cette requête nous présente une disposition différente de les mêmes données, avec une ligne pour chaque année, mais deux colonnes pour chaque mois.

Et maintenant

Pour exécuter les exemples de requêtes utilisés dans ce blog, veuillez consulter les exemples de pivot SQL dans ce carnet d’accompagnement.

Merci aux contributeurs de la communauté Apache Spark pour leurs contributions!

Essayez Databricks gratuitement. Commencez dès aujourd’hui

Write a Comment

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *