Spark DataFrame限制功能需要太多时间才能显示

时间:2019-02-10 09:49:36

标签: python-3.x pyspark bigdata data-science

import pyspark
from pyspark.sql import SparkSession
from pyspark.conf import SparkConf
import findspark
from pyspark.sql.functions import countDistinct
spark = SparkSession.builder \
.master("local[*]") \
.appName("usres mobile related information analysis") \
.config("spark.submit.deployMode", "client") \
.config("spark.executor.memory","3g") \
.config("spark.driver.maxResultSize", "1g") \
.config("spark.executor.pyspark.memory","3g") \
.enableHiveSupport() \
.getOrCreate()

handset_info = ora_tmp.select('some_value','some_value','some_value','some_value','some_value','some_value','some_value')

我使用3gb执行内存和3gb执行pyspark内存配置spark。我的数据库有超过7000万行。显示我叫

 handset_info.show()

方法显示在2-5秒之间的前20行。但是当我尝试运行以下代码

mobile_info_df = handset_info.limit(30)
mobile_info_df.show()

要显示前30行,需要太多时间(3-4小时)。花费那么多时间是否合乎逻辑。我的配置有问题吗? 我的笔记本电脑的配置是-

  • 配备8GB内存的Core i7(4核)笔记本电脑

3 个答案:

答案 0 :(得分:1)

正如您已经体验到的那样,具有大数据的limit()的性能非常糟糕。希望与其他任何有此问题的人共享解决方法。 如果不必严格限制数量,请使用sort()或orderBy()对列进行排序,然后使用filter()来获取前k%的行。

答案 1 :(得分:1)

Spark 将您传递给 limit() 的参数复制到每个分区,因此在您的情况下,它会尝试读取每个分区的 30 行。我猜你碰巧有大量的分区(这在任何情况下都不好)。试试 df.coalesce(1).limit(30).show(),它的运行速度应该和 df.show() 一样快。

答案 2 :(得分:0)

您的配置很好。巨大的持续时间差异是由基础实现引起的。区别在于limit()在创建具有30行的数据帧之前先读取所有7000万行。相反,show()仅占用现有数据帧的前20行,因此只能读取这20行。 如果您只是想显示30行而不是20行,则可以使用30作为参数来调用show()方法:

df2 = pd.DataFrame(np.array([[5,0,-3],['nyc','sf','chi']]), columns=['col1','col2','col3'], index=['value','location'])