web-dev-qa-db-fra.com

Transposition de la trame de données avec pyspark dans Apache Spark

J'ai un dataframe df qui a la structure suivante:

+-----+-----+-----+-------+
|  s  |col_1|col_2|col_...|
+-----+-----+-----+-------+
| f1  |  0.0|  0.6|  ...  |
| f2  |  0.6|  0.7|  ...  |
| f3  |  0.5|  0.9|  ...  |
|  ...|  ...|  ...|  ...  |

Et je veux calculer la transposition de cette trame de données pour qu'elle ressemble à

+-------+-----+-----+-------+------+
|  s    | f1  | f2  | f3    |   ...|
+-------+-----+-----+-------+------+
|col_1  |  0.0|  0.6|  0.5  |   ...|
|col_2  |  0.6|  0.7|  0.9  |   ...|
|col_...|  ...|  ...|  ...  |   ...|

J'ai lié ces deux solutions mais cela retourne que dataframe n'a pas la méthode utilisée spécifiée:

méthode 1:

 for x in df.columns:
    df = df.pivot(x)

méthode 2:

df = sc.parallelize([ (k,) + Tuple(v[0:]) for k,v in df.items()]).toDF()

comment puis-je réparer cela.

9
Mèhdi Ben Hamida

Si les données sont suffisamment petites pour être transposées (pas pivotées avec agrégation), vous pouvez simplement les convertir en Pandas DataFrame:

df = sc.parallelize([
    ("f1", 0.0, 0.6, 0.5),
    ("f2", 0.6, 0.7, 0.9)]).toDF(["s", "col_1", "col_2", "col_3"])

df.toPandas().set_index("s").transpose()
s       f1   f2
col_1  0.0  0.6
col_2  0.6  0.7
col_3  0.5  0.9

S'il est trop grand pour cela, Spark n'aidera pas. Spark DataFrame distribue les données par ligne (bien qu'il utilise localement le stockage en colonnes) , par conséquent, la taille d'une ligne individuelle est limitée à la mémoire locale.

12
Alper t. Turker