大numpy阵列触发数据帧

大numpy阵列触发数据帧,numpy,apache-spark,pyspark,apache-spark-sql,rdd,Numpy,Apache Spark,Pyspark,Apache Spark Sql,Rdd,我有一个大的numpy阵列。它的形状是(800224,3),这意味着有三个通道的图像(224*244)。对于Spark中的分布式深度学习,我想将“numpy数组”更改为“Spark数据帧” 我的方法是: 将numpy数组更改为csv 加载csv并生成具有150528列(224*224*3)的spark数据帧 使用VectorAssembler创建所有列(特征)的向量 重新调整3的输出,但在第三步中,我失败了,因为计算可能太高了 要从中生成向量,请执行以下操作: +------+------+ |

我有一个大的numpy阵列。它的形状是(800224,3),这意味着有三个通道的图像(224*244)。对于Spark中的分布式深度学习,我想将“numpy数组”更改为“Spark数据帧”

我的方法是:

  • 将numpy数组更改为csv
  • 加载csv并生成具有150528列(224*224*3)的spark数据帧
  • 使用
    VectorAssembler
    创建所有列(特征)的向量
  • 重新调整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阵列配合得很好

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

    您应该能够将
    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"])
    

    您也可以这样做,我觉得这是最方便的:

    将numpy导入为np
    作为pd进口熊猫
    进口Pypark
    sc=pyspark.SparkContext()
    sqlContext=sqlContext(sc)
    数组=np.linspace(0,10)
    df_spark=sqlContext.createDataFrame(pd.DataFrame(数组))
    df_spark.show()
    

    唯一的缺点是需要安装pandas。

    内存不足错误,是吗?你能试着将驱动程序内存设置到你能给它的最大值吗?我使用6g,我的笔记本ram是8gb。在本地使用spark时调整执行器内存是否重要?当我们有一个集群和多个工作节点时,就会使用执行器,对吗?在这种情况下,我建议尝试增加驱动程序内存。如果工作方式不同,请帮助我。不,在本地模式下,执行器内存并不重要,因为执行器和驱动程序都运行在同一个JVM进程中,通过设置驱动程序内存,可以增加JVM进程的内存。问题是,他说这项工作在单机上运行良好,所以我假设他在集群模式下工作是的,我在集群模式下工作。你的回答也帮了我很大的忙!!我是spark新手,尤其是pyspark和python。虽然我的项目进展缓慢,但我想我会成功的。谢谢大家!!!您好,它给了我这个错误“TypeError:不支持的类型:”@A.B:尝试转换为向量元组,看看它是否有效,您可以参考:鉴于A.B.的评论和测试,这个答案实际上不起作用。@JohnStud:您是对的。似乎我没有收到A.B.的回复,说使用元组是否有效,然后我就忘了。我测试了一下并更新了答案。现在应该可以了。