使用Pyarrow读取Spark编写的镶木地板文件会显着增加内存

我遇到了这个问题,当我尝试读取实木复合地板文件时,容器的内存使用量急剧增加。实木复合地板文件是使用Spark编写的,我正在尝试使用Pyarrow进行读取。

在这种特定情况下,一个10mb的实木复合地板文件的大小超过3gb。我猜想某些列的数据类型会预留大量内存,但我不确定。

这是我所看到的代码和一些屏幕截图:

写入文件的代码(Scala 2.11,spark 2.2.1,(AWS Glue)):

  def write(implicit spark: SparkSession,df: DataFrame,s3Bucket: String,s3Key: String,mode: String): Boolean ={
    df.write
      .mode(mode)
      .option("header",true)
      .parquet(s3Bucket + "/" + s3Key)

    true
  }
}

文件写入后的架构:

使用Pyarrow读取Spark编写的镶木地板文件会显着增加内存

读取文件的代码(pandas == 0.25.2,pyarrow == 0.15.1):

@profile
def readParquet():
    srDf = pq.Parquetdataset('test.parquet').read().to_pandas()
    print(srDf.info(verbose=True))

readParquet()

memory_profiler的输出:

使用Pyarrow读取Spark编写的镶木地板文件会显着增加内存

文件本身:

使用Pyarrow读取Spark编写的镶木地板文件会显着增加内存

读取后的文件架构:

使用Pyarrow读取Spark编写的镶木地板文件会显着增加内存

我对为什么在pyarrow中将字符串列推断为对象类型感到困惑。我相信这就是导致所有内存增加的原因。这是少量数据,我希望在AWS lambda中对其进行处理,但是lambda具有3gb的内存限制,因此我无法在那里读取文件。我研究了尝试为pyarrow明确定义一个架构,以按如下方式读取镶木地板文件,但似乎无法正常工作。除非我忽略了某些内容,否则似乎不支持它。如果你们在我的实现中看到明显的错误,请告诉我。谢谢。

skiiyxia 回答:使用Pyarrow读取Spark编写的镶木地板文件会显着增加内存

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3070904.html

大家都在问