仅检索数据框列时出现pyspark java堆空间错误

问题描述

对于以下指向 hive 表的分区并获取列的简单示例,spark 的惰性求值真的执行任何操作吗?

>>> spark.sql('select * from default.test_table where day="2021-01-01"').columns
[Stage 0:===============================>                   (1547 + 164) / 2477]#
# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="kill -9 %p"
#   Executing /bin/sh -c "kill -9 28049"...
ERROR:root:Exception while sending command.
Traceback (most recent call last):
  File "/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py",line 985,in send_command
    response = connection.send_command(command)
  File "/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py",line 1164,in send_command
    "Error while receiving",e,proto.ERROR_ON_RECEIVE)
Py4JNetworkError: Error while receiving
Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
  File "/usr/lib/spark/python/pyspark/sql/session.py",line 767,in sql
    return DataFrame(self._jsparkSession.sql(sqlQuery),self._wrapped)
  File "/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py",line 1257,in __call__
  File "/usr/lib/spark/python/pyspark/sql/utils.py",line 63,in deco
    return f(*a,**kw)
  File "/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py",line 336,in get_return_value
py4j.protocol.Py4JError: An error occurred while calling o61.sql

我不明白为什么仅仅指向一个 hive 表会占用 PySpark(版本 2.4.3)的大量内存。向驱动程序和执行程序添加内存(驱动程序内存,执行程序内存)只会使查询永远卡住,而不会输出任何有用的消息。有没有办法在定义数据框时抑制 PySpark 的执行?

解决方法

您可以对查询设置限制以避免内存错误:

spark.sql('select * from default.test_table where day="2021-01-01" limit 1').columns

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...