web-dev-qa-db-ja.com

Pyspark Dataframeからnumpy配列を抽出する

私はデータフレームを持っていますgi_man_dfここでグループは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|
+------------------+-----------------+--------+--------------+

そして、私はnumpy nd_array、つまり、gi_man_arrayを期待しています:

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

ここで、ピボットを適用した後のRand_double値。

次の2つのアプローチを試しました。
最初: gi_man_dfを次のようにピボットします。

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

私が得た出力は次のとおりです。

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)

しかし、ここでの問題は、目的の出力を取得することです。それを行列に変換してから、再びnumpy配列に変換することはできません。

SECOND:次を使用してデータフレーム自体にベクトルを作成しました:

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

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

そして、私は次の出力を得ました:

+----------------+-----------------+--------+--------------+--------------+
|           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]|
+----------------+-----------------+--------+--------------+--------------+

しかし、ここでの問題はRand_dbl_Vectでピボットできないことです。

だから私の質問は:
1。 2つのアプローチのいずれかが目的の出力を達成する正しい方法ですか?そうであれば、どのようにさらに進めて目的の結果を得ることができますか?
2。コードを最適化し、パフォーマンスを向上させるために、他にどのような方法で進めることができますか?

13

この

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

生産する

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