【问题标题】:How to convert a pyspark dataframe column to numpy array如何将 pyspark 数据框列转换为 numpy 数组
【发布时间】:2019-09-30 06:48:33
【问题描述】:

我正在尝试将具有大约 9000 万行的 pyspark 数据框列转换为 numpy 数组。

我需要数组作为scipy.optimize.minimize 函数的输入。

我尝试过转换为 Pandas 和使用 collect(),但这些方法非常耗时。

我是 PySpark 的新手,如果有更快更好的方法来做到这一点,请帮助。

谢谢

这就是我的数据框的样子。

+----------+
|Adolescent|
+----------+
|       0.0|
|       0.0|
|       0.0|
|       0.0|
|       0.0|
|       0.0|
|       0.0|
|       0.0|
|       0.0|
|       0.0|
+----------+

【问题讨论】:

  • 你试过df['Adolescent'].to_numpy()df['Adolescent'].array吗?
  • 看起来 to_numpy() 仅适用于 pandas 数据框,不适用于 pyspark。我尝试了 df["Adolescent"].array,它给出了输出:"Column"。我不知道如何将其用作数组。

标签: python numpy apache-spark pyspark


【解决方案1】:

#1

您必须以任何方式致电.collect()。要从 pyspark 数据框创建一个 numpy 数组,您可以使用:

adoles = np.array(df.select("Adolescent").collect()) #.reshape(-1) for 1-D array

#2

您可以使用toPandas() 将其转换为pandas 数据框,然后您可以使用.values 将其转换为numpy 数组。

pdf = df.toPandas()
adoles = df["Adolescent"].values

或者简单地说:

adoles = df.select("Adolescent").toPandas().values #.reshape(-1) for 1-D array

#3

分布式数组可以试试Dask Arrays

我没有对此进行测试,但假设它与 numpy 的工作方式相同(可能存在不一致):

import dask.array as da
adoles = da.array(df.select("Adolescent").collect()) #.reshape(-1) for 1-D array

【讨论】:

  • 我尝试过使用 toPandas() 但它需要很多时间。
  • 你应该看看Dask Arrays
  • 感谢您的帮助。我现在正在尝试使用 dask 数组。
【解决方案2】:

另一种方法是将选中的列转换为RDD,然后通过提取每个Row的值进行展平(可以滥用.keys()),然后转换为numpy数组:

x = df.select("colname").rdd.map(lambda r: r[0]).collect()  # python list
np.array(x)  # numpy array

【讨论】:

    猜你喜欢
    • 2021-02-10
    • 1970-01-01
    • 2018-12-15
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 2014-03-23
    相关资源
    最近更新 更多