将垃圾公园数据框转换为熊猫数据框架

共2个回答, 标签: pandas pyspark apache-spark-2.3

我有 pyspark 数据框的尺寸是 (28002528, 21), 并尝试使用以下代码行将其转换为熊猫数据框:

pd_df=spark_df.toPandas()

我得到了此错误:

第一部分

Py4JJavaError: An error occurred while calling o170.collectToPython.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 3 in stage 39.0 failed 1 times, most recent failure: Lost task 3.0 in stage 39.0 (TID 89, localhost, executor driver): java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3236)
    at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
    at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
    at net.jpountz.lz4.LZ4BlockOutputStream.flushBufferedData(LZ4BlockOutputStream.java:220)
    at net.jpountz.lz4.LZ4BlockOutputStream.write(LZ4BlockOutputStream.java:173)
    at java.io.DataOutputStream.write(DataOutputStream.java:107)
    at org.apache.spark.sql.catalyst.expressions.UnsafeRow.writeToStream(UnsafeRow.java:552)
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:256)
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:247)
    at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$25.apply(RDD.scala:830)
    at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$25.apply(RDD.scala:830)
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:288)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
    at org.apache.spark.scheduler.Task.run(Task.scala:109)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:345)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)


Driver stacktrace:
        at org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$failJobAndIndependentStages(DAGScheduler.scala:1599)
        ...
        ...

Caused by: java.lang.OutOfMemoryError: Java heap space
        ...
        ...

第二部分

Exception happened during processing of request from ('127.0.0.1', 56842)
ERROR:py4j.java_gateway:An error occurred while trying to connect to the Java server (127.0.0.1:56657)
Traceback (most recent call last):
        ...
        ...
ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host

During handling of the above exception, another exception occurred:
        ...
        ...

我也试图采取原来的垃圾公园数据框的样本

smaple_pd_df=spark_df.sample(0.05).toPandas()

我得到了一个错误看起来像前一个错误的第一部分

第1个答案

您可以得到 java.lang.OutOfMemoryError 这可能意味着您正在尝试将所有数据加载到一个节点中, 该节点没有足够的 ram 来处理整个数据框架。如果您使用的是云解决方案提供商 (如 Databricks), 请尝试增加群集 RAM 的大小。

第2个答案

这样 toPandas() 做的方法是将整个数据帧收集到一个节点中 (如 @ulmefors 的答案中所述)。

更具体地说, 它将其收集到驱动程序。您应该进行微调的特定选项是 spark.driver.memory , 相应地增加它。

否则, 如果你打算在这个 (相当大的) 熊猫数据框上做进一步的转换, 你可以考虑先在 pyspark 中做, 然后将 (较小的) 结果收集到驱动程序中, 希望这将适合记忆。

更多详细信息可在 spark 配置文档中找到,请参见此处

相关问题

如何破坏 Python 对象并释放内存 将具有特殊格式的文本文档转换为熊猫数据框架 用两本字典绘制一只熊猫专栏图 将垃圾公园数据框转换为熊猫数据框架 Spark: 为什么 Python 在我的用例中明显优于 Scala? 火花是否优化了在垃圾公园中相同但独立的 Dag?