pyspark - 仅检索数据框列时的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
我不明白为什么仅仅指向一个蜂巢表会占用 PySpark(版本 2.4.3)的大量内存。向驱动程序和执行程序(驱动程序内存,执行程序内存)添加内存只会使查询永远卡住,而不会输出任何有用的消息。有没有办法在定义数据框时抑制 PySpark 的执行?
解决方案
您可以限制查询以避免内存错误:
spark.sql('select * from default.test_table where day="2021-01-01" limit 1').columns
推荐阅读
- python - 无法在 google(课堂)api 中编写 fetch_token() 构造
- python - 将 Json 对象数组上传到 Firestore
- kotlin - 调用接口中声明的接收函数
- arrays - C在其他函数中更改数组的指针地址以更改数组中值的位置
- blazor - “自定义”IdentityServer 实现和 EntityFrameworkStore 移除查询
- python - 基于队列的通信:发送返回队列是个好主意吗?
- c - 如何在c中扫描二进制文件中的病毒签名?
- birt - BIRT Maximo 可以将参数对话框提示文本添加到单个参数吗?在 ide 中工作而不是在 Maximo
- php - 在数组中获取我所有的 Woocommerce 产品 ID
- qt - 如何让 QPushButton 默认处于选中状态?