用于激发数据帧的大型numpy数组

问题描述 投票:1回答:2

我有一个很大的numpy数组。它的形状是(800,224,224,3),这意味着有3个通道的图像(224 * 244)。对于Spark中的分布式深度学习,我想将'numpy array'更改为'spark dataframe'。

我的方法是:

  1. 将numpy数组更改为csv
  2. 加载csv并使用150528列(224 * 224 * 3)制作火花数据帧
  3. 使用VectorAssembler创建所有列的向量(要素)
  4. 重塑3的输出,但在第三步,我失败了,因为计算可能太高了

为了从这里制作一个矢量:

+------+------+
|col_1 | col_2|
+------+------+
|0.1434|0.1434|
|0.1434|0.1451|
|0.1434|0.1467|
|0.3046|0.3046|
|0.3046|0.3304|
|0.3249|0.3046|
|0.3249|0.3304|
|0.3258|0.3258|
|0.3258|0.3263|
|0.3258|0.3307|
+------+------+

对此:

+-------------+
|   feature   |
+-------------+
|0.1434,0.1434|
|0.1434,0.1451|
|0.1434,0.1467|
|0.3046,0.3046|
|0.3046,0.3304|
|0.3249,0.3046|
|0.3249,0.3304|
|0.3258,0.3258|
|0.3258,0.3263|
|0.3258,0.3307|
+-------------+

但是列数真的很多......

我也尝试将numpy数组直接转换为rdd,但是出现“内存不足”错误。在单机中,我的工作适用于这个numpy数组。

numpy apache-spark pyspark apache-spark-sql rdd
2个回答
2
投票

您应该能够将numpy数组直接转换为Spark数据帧,而无需通过csv文件。您可以尝试类似下面的代码:

from pyspark.ml.linalg import Vectors

df = map(lambda x: Vectors.dense(x), numpy_df)
df2 = spark.createDataFrame(df,["features"])

1
投票

如果在工作节点中出现错误,则使用spark.executor.memory标志将工作程序内存从默认值1 GB增加以解决内存不足错误,否则如果在驱动程序中出现此错误,请尝试按照@建议增加驱动程序内存pissall。此外,尝试确定用于将RDD保留在内存中的适当内存部分(spark.memory.fraction)。

© www.soinside.com 2019 - 2024. All rights reserved.