大数字数组来激发数据帧



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

我的方法是:

  1. 将数字数组更改为 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数组直接转换为 Spark 数据帧,而无需通过 csv 文件。您可以尝试以下代码:

from pyspark.ml.linalg import Vectors
num_rows = 800
arr = map(lambda x: (Vectors.dense(x), ), numpy_arr.reshape(num_rows, -1))
df = spark.createDataFrame(arr, ["features"])

你也可以这样做,我觉得最方便:

import numpy as np
import pandas as pd
import pyspark
sc = pyspark.SparkContext()
sqlContext = SQLContext(sc)
array = np.linspace(0, 10)
df_spark = sqlContext.createDataFrame(pd.DataFrame(array))
df_spark.show()

唯一的缺点是需要安装熊猫。

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

相关内容

  • 没有找到相关文章

最新更新