Spark Java堆

2024-06-14 14:19:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我不知道这里发生了什么,为什么。在

我有一个数据帧,它同时被加载为pandas和spark数据帧。在

数据帧是稀疏的,意味着大部分是零。它的尺寸是56K X 9K。所以没那么大

我还将以下命令放在我的spark/conf/spark中-默认值.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

如果你看到了,我已经为驱动程序分配了8GB,为执行器分配了2G。我正在使用安装在MacBookPro上的Spark。在

当我这么做的时候

^{pr2}$

要看前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()时,推荐程序_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使用,但是spark中的相同数据帧在使用.show()或.head()时会抛出java堆错误。而且在抛出错误之前要花很多时间。在

我不明白为什么会这样。Spark不应该比pandas快,当同样的数据帧可以用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


Tags: 数据inselfpandasreturnvalueshowjava
2条回答

我如何用Java解决同样的问题: 将需要执行的查询分成2个(或更多)部分。执行前半部分,将结果保存到HDFS(作为拼花)。创建第二个SqlContext,从HDFS读取前半部分的结果,然后执行下半部分查询。在

相关问题 更多 >