从Pyspark Dataframe中提取numpy数组

Uda*_*ngh 15 numpy apache-spark pyspark spark-dataframe apache-spark-mllib

我有一个数据帧gi_man_df,其中group可以是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|
+------------------+-----------------+--------+--------------+
Run Code Online (Sandbox Code Playgroud)

我期待一个numpy nd_array,即gi_man_array:

[[[124.2],[121.15],[129.0],[125.0],[125.0],[127.0],[126.0]]]
Run Code Online (Sandbox Code Playgroud)

应用pivot后rand_double的值.

我尝试了以下两种方法:首先
:我按如下方式转动gi_man_df:

gi_man_pivot = gi_man_df.groupBy("number").pivot('rand_int').sum("rand_double")
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

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)
Run Code Online (Sandbox Code Playgroud)

但这里的问题是获得所需的输出,我无法将其转换为矩阵然后再转换为numpy数组.

SECOND: 我使用以下方法在数据框中创建了向量:

assembler = VectorAssembler(inputCols=["rand_double"],outputCol="rand_double_vector")

gi_man_vector = assembler.transform(gi_man_df)
gi_man_vector.show(7)
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

+----------------+-----------------+--------+--------------+--------------+
|           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]|
+----------------+-----------------+--------+--------------+--------------+
Run Code Online (Sandbox Code Playgroud)

但问题是我无法在rand_dbl_Vect上转动它.

所以我的问题是:
1.两种方法中的任何一种都是实现所需输出的正确方法,如果是,那么我该如何进一步获得所需的结果呢?
2.我可以采用哪种其他方式,因此代码是最佳的,性能良好?

dat*_*eve 20

这个

import numpy as np
np.array(gi_man_df.select('rand_double').collect())
Run Code Online (Sandbox Code Playgroud)

产生

array([[ 124.2 ],
       [ 121.15],
       .........])
Run Code Online (Sandbox Code Playgroud)

  • @UdayShankarSingh 如果不在您的驱动程序的内存中,您想在哪里保存这个 numpy 数组?我问是因为我正在做类似的事情,我能想到的唯一解决方案是以足够小的块对数据帧进行批处理,以将结果数组保存在内存中。 (4认同)
  • 我无法使用 collect,因为当前数据大小为 20TB,并且每个月都会增加约 5TB。所以使用 collect 不是一个可行的选择,因为它需要大量的驱动程序内存。 (2认同)