我不确定这里发生了什么以及为什么。
我有一个数据框,它同时作为熊猫和火花数据框加载。
数据框是稀疏的,主要是零。它的尺寸是 56K X 9K。所以没那么大
我还将以下命令放入我的 spark/conf/spark-defaults.conf 文件中
spark.driver.memory 8g
spark.executor.memory 2g
spark.driver.maxResultSize 2g
spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value
spark.jars.packages com.databricks:spark-csv_2.11:1.4.0
因此,如果您看到,我已经为 Driver 分配了 8GB,为 executor 分配了 2G。我正在使用本地安装在我的 Macbook Pro 上的 Spark。
当我做
recommender_ct.show()
看到前 5 行,这就是我得到的:
---------------------------------------------------------------------------
Py4JJavaError Traceback (most recent call last)
<ipython-input-7-8c71bfcdfd03> in <module>()
----> 1 recommender_ct.show()
/Users/i854319/spark/python/pyspark/sql/dataframe.pyc in show(self, n, truncate)
255 +---+-----+
256 """
--> 257 print(self._jdf.showString(n, truncate))
258
259 def __repr__(self):
/Users/i854319/spark/python/lib/py4j-0.9-src.zip/py4j/java_gateway.py in __call__(self, *args)
811 answer = self.gateway_client.send_command(command)
812 return_value = get_return_value(
--> 813 answer, self.gateway_client, self.target_id, self.name)
814
815 for temp_arg in temp_args:
/Users/i854319/spark/python/pyspark/sql/utils.pyc in deco(*a, **kw)
43 def deco(*a, **kw):
44 try:
---> 45 return f(*a, **kw)
46 except py4j.protocol.Py4JJavaError as e:
47 s = e.java_exception.toString()
/Users/i854319/spark/python/lib/py4j-0.9-src.zip/py4j/protocol.py in get_return_value(answer, gateway_client, target_id, name)
306 raise Py4JJavaError(
307 "An error occurred while calling {0}{1}{2}.\n".
--> 308 format(target_id, ".", name), value)
309 else:
310 raise Py4JError(
Py4JJavaError: An error occurred while calling o40.showString.
: java.lang.OutOfMemoryError: Java heap space
该数据框是使用 Spark 数据框的交叉表创建的,如下所示:
recommender_ct=recommender_sdf.crosstab('TRANS','ITEM')
当使用 .show() 时,recommender_sdf 上方的 spark 数据框可以正常工作。
相同的交叉表方法用于 pandas 数据框,当我在下面这样做时,它工作得很好。
# Creating a new pandas dataframe for cross-tab
recommender_pct=pd.crosstab(recommender_pdf['TRANS'], recommender_pdf['ITEM'])
recommender_pct.head()
这立即起作用。
这表明该文件很容易被加载到内存中并且可以被 pandas 使用,但是当使用 .show() 或 .head() 时,spark 中的相同数据帧会引发 java 堆错误。并且在抛出错误之前需要很多时间。
我不明白为什么会这样。当可以使用 pandas 轻松访问和打印相同的数据帧时,Spark 不应该比 pandas 更快并且不应该有这个内存问题。
编辑:
好的。当我从相应的 pandas 数据框中获取前几行和几列时,交叉选项卡的 spark 数据框看起来像这样
TRANS Bob Iger: How Do Companies Foster Innovation and Sustain Relevance “I Will What I Want” - Misty Copeland "On the Lot" with Disney Producers "Your Brain is Good at Inclusion...Except When it's Not" with Dr. Steve Robbins (please do not use) WDW_ER-Leaders of Minors 1. EAS Project Lifecycle Process Flow 10 Life Lessons from Star Wars 10 Simple Steps to Exceptional Daily Productivity 10 Steps to Effective Listening
0 353 0 0 0 0 0 0 0 0 0
1 354 0 0 0 0 0 0 0 0 0
2 355 0 0 0 0 0 0 0 0 0
3 356 0 0 0 0 0 0 0 0 0
4 357 0 0 0 0 0 0 0 0 0
列名基本上是长文本字符串。列值为 0 或 1