问题描述
对于以下指向 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