web-dev-qa-db-fra.com

extraire un tableau numpy de Pyspark Dataframe

J'ai un dataframe gi_man_df où le groupe peut être n:

+------------------+-----------------+--------+--------------+
|           group  |           number|Rand_int|   Rand_double|
+------------------+-----------------+--------+--------------+
|          'GI_MAN'|                7|       3|         124.2|
|          'GI_MAN'|                7|      10|        121.15|
|          'GI_MAN'|                7|      11|         129.0|
|          'GI_MAN'|                7|      12|         125.0|
|          'GI_MAN'|                7|      13|         125.0|
|          'GI_MAN'|                7|      21|         127.0|
|          'GI_MAN'|                7|      22|         126.0|
+------------------+-----------------+--------+--------------+

et j'attends un nd_array numpy c'est-à-dire gi_man_array:

[[[124.2],[121.15],[129.0],[125.0],[125.0],[127.0],[126.0]]]

où Rand_double valeurs après application du pivot.

J'ai essayé les 2 approches suivantes:
PREMIER: Je fais pivoter le gi_man_df comme suit:

gi_man_pivot = gi_man_df.groupBy("number").pivot('Rand_int').sum("Rand_double")

et la sortie que j'ai obtenue est:

Row(number=7, group=u'GI_MAN', 3=124.2, 10=121.15, 11=129.0, 12=125.0, 13=125.0, 21=127.0, 23=126.0)

mais ici, le problème est d'obtenir la sortie souhaitée, je ne peux pas la convertir en matrice, puis la reconvertir en tableau numpy.

SECOND: J'ai créé le vecteur dans le dataframe lui-même en utilisant:

assembler = VectorAssembler(inputCols=["Rand_double"],outputCol="Rand_double_vector")

gi_man_vector = assembler.transform(gi_man_df)
gi_man_vector.show(7)

et j'ai obtenu la sortie suivante:

+----------------+-----------------+--------+--------------+--------------+
|           group|           number|Rand_int|   Rand_double| Rand_dbl_Vect|
+----------------+-----------------+--------+--------------+--------------+
|          GI_MAN|                7|       3|         124.2|       [124.2]|
|          GI_MAN|                7|      10|        121.15|      [121.15]|
|          GI_MAN|                7|      11|         129.0|       [129.0]|
|          GI_MAN|                7|      12|         125.0|       [125.0]|
|          GI_MAN|                7|      13|         125.0|       [125.0]|
|          GI_MAN|                7|      21|         127.0|       [127.0]|
|          GI_MAN|                7|      22|         126.0|       [126.0]|
+----------------+-----------------+--------+--------------+--------------+

mais le problème ici est que je ne peux pas le faire pivoter sur Rand_dbl_Vect.

Ma question est donc:
1. Est-ce que l'une des 2 approches est la bonne façon d'atteindre le résultat souhaité, si oui, comment puis-je continuer pour obtenir le résultat souhaité?
2. De quelle autre manière je peux procéder pour que le code soit optimal et que les performances soient bonnes?

13
Uday Shankar Singh

Cette

import numpy as np
np.array(gi_man_df.select('Rand_double').collect())

produit

array([[ 124.2 ],
       [ 121.15],
       .........])
19
data_steve