Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pyspark:使用Pyspark.sql.dataframe.dataframe需要很长时间_Python_Pandas_Dataframe_Pyspark - Fatal编程技术网

Python Pyspark:使用Pyspark.sql.dataframe.dataframe需要很长时间

Python Pyspark:使用Pyspark.sql.dataframe.dataframe需要很长时间,python,pandas,dataframe,pyspark,Python,Pandas,Dataframe,Pyspark,我有一个类似下面的pyspark.sql.dataframe.dataframe df.show() +--------------------+----+----+---------+----------+---------+----------+---------+ | ID|Code|bool| lat| lon| v1| v2| v3| +--------------------+----+--

我有一个类似下面的
pyspark.sql.dataframe.dataframe

df.show()
+--------------------+----+----+---------+----------+---------+----------+---------+
|                  ID|Code|bool|      lat|       lon|       v1|        v2|       v3|
+--------------------+----+----+---------+----------+---------+----------+---------+
|5ac52674ffff34c98...|IDFA|   1|42.377167| -71.06994|17.422535|1525319638|36.853622|
|5ac52674ffff34c98...|IDFA|   1| 42.37747|-71.069824|17.683573|1525319639|36.853622|
|5ac52674ffff34c98...|IDFA|   1| 42.37757| -71.06942|22.287935|1525319640|36.853622|
|5ac52674ffff34c98...|IDFA|   1| 42.37761| -71.06943|19.110023|1525319641|36.853622|
|5ac52674ffff34c98...|IDFA|   1|42.377243| -71.06952|18.904774|1525319642|36.853622|
|5ac52674ffff34c98...|IDFA|   1|42.378254| -71.06948|20.772903|1525319643|36.853622|
|5ac52674ffff34c98...|IDFA|   1| 42.37801| -71.06983|18.084948|1525319644|36.853622|
|5ac52674ffff34c98...|IDFA|   1|42.378693| -71.07033| 15.64326|1525319645|36.853622|
|5ac52674ffff34c98...|IDFA|   1|42.378723|-71.070335|21.093477|1525319646|36.853622|
|5ac52674ffff34c98...|IDFA|   1| 42.37868| -71.07034|21.851894|1525319647|36.853622|
|5ac52674ffff34c98...|IDFA|   1|42.378716| -71.07029|20.583202|1525319648|36.853622|
|5ac52674ffff34c98...|IDFA|   1| 42.37872| -71.07067|19.738768|1525319649|36.853622|
|5ac52674ffff34c98...|IDFA|   1|42.379112| -71.07097|20.480911|1525319650|36.853622|
|5ac52674ffff34c98...|IDFA|   1| 42.37952|  -71.0708|20.526752|1525319651| 44.93808|
|5ac52674ffff34c98...|IDFA|   1| 42.37902| -71.07056|20.534052|1525319652| 44.93808|
|5ac52674ffff34c98...|IDFA|   1|42.380203|  -71.0709|19.921381|1525319653| 44.93808|
|5ac52674ffff34c98...|IDFA|   1| 42.37968|-71.071144| 20.12599|1525319654| 44.93808|
|5ac52674ffff34c98...|IDFA|   1|42.379696| -71.07114|18.760069|1525319655| 36.77853|
|5ac52674ffff34c98...|IDFA|   1| 42.38011| -71.07123|19.155525|1525319656| 36.77853|
|5ac52674ffff34c98...|IDFA|   1| 42.38022|  -71.0712|16.978994|1525319657| 36.77853|
+--------------------+----+----+---------+----------+---------+----------+---------+
only showing top 20 rows
如果尝试计数

%%time
df.count()

CPU times: user 4 ms, sys: 0 ns, total: 4 ms
Wall time: 28.1 s

30241272
现在,如果我取
df
的一个子集,计数的时间甚至更长

id0 = df.first().ID  ## First ID
tmp = df.filter( (df['ID'] == id0) )

%%time
tmp.count()

CPU times: user 12 ms, sys: 0 ns, total: 12 ms
Wall time: 1min 33s
Out[6]:
3299
这是因为spark是。调用tmp.count()时,这是一个操作步骤。换句话说,tmp.count的计时也包括过滤时间。如果要真正比较这两个计数,请尝试以下方法:

%%time
df.count()

id0 = df.first().ID  ## First ID
tmp = df.filter( (df['ID'] == id0) )
tmp.persist().show()

%%time
tmp.count()
这里的重要组件是执行计数之前的tmp.persist().show()。这将执行筛选并缓存结果。这样,tmp.count()只包括实际计数时间。

这是因为spark是。调用tmp.count()时,这是一个操作步骤。换句话说,tmp.count的计时也包括过滤时间。如果要真正比较这两个计数,请尝试以下方法:

%%time
df.count()

id0 = df.first().ID  ## First ID
tmp = df.filter( (df['ID'] == id0) )
tmp.persist().show()

%%time
tmp.count()

这里的重要组件是执行计数之前的tmp.persist().show()。这将执行筛选并缓存结果。这样一来,tmp.count()只包括实际的计数时间。

您的问题非常复杂

为了重现你的行为,我用一个大数据集进行了测试

问题描述 我在一个大型数据集中测试了以下两个案例:

# Case 1
df.count() # Execution time: 37secs

# Case 2
df.filter((df['ID'] == id0)).count() #Execution time: 1.39 min
解释 让我们仅使用
.count()
查看物理计划:

通常,Spark when counts of rows映射count=1的行,并减少所有映射器以创建最终行数

案例2中Spark必须首先过滤,然后为每个分区创建部分计数,然后再进行另一个阶段将这些计数相加。因此,对于相同的行,在第二种情况下,Spark也会进行过滤,这会影响大型数据集中的计算时间。Spark是一个用于分布式处理的框架,没有像Pandas这样的索引,可以在不传递所有行的情况下极快地进行过滤

总结 在这种简单的情况下,您不能做很多事情来提高执行时间。
您可以使用不同的配置设置(例如#spark.sql.shuffle.partitions,
#spark.default.parallelism
#执行器的
#执行器内存
等)尝试应用程序。

您的问题非常棘手

为了重现你的行为,我用一个大数据集进行了测试

问题描述 我在一个大型数据集中测试了以下两个案例:

# Case 1
df.count() # Execution time: 37secs

# Case 2
df.filter((df['ID'] == id0)).count() #Execution time: 1.39 min
解释 让我们仅使用
.count()
查看物理计划:

通常,Spark when counts of rows映射count=1的行,并减少所有映射器以创建最终行数

案例2中Spark必须首先过滤,然后为每个分区创建部分计数,然后再进行另一个阶段将这些计数相加。因此,对于相同的行,在第二种情况下,Spark也会进行过滤,这会影响大型数据集中的计算时间。Spark是一个用于分布式处理的框架,没有像Pandas这样的索引,可以在不传递所有行的情况下极快地进行过滤

总结 在这种简单的情况下,您不能做很多事情来提高执行时间。
您可以使用不同的配置设置(例如#spark.sql.shuffle.partitions、
#spark.default.parallelism
、执行器的、
#执行器内存
等)尝试您的应用程序。

情况越来越糟。您能在更改后发布输出吗?持久(或缓存)方法返回一个新的DF。。改为使用
tmp=tmp.persist()
然后使用
tmp.count()
。@Blackishop在Python中,您不需要分配新变量,您可以使用相同的
tmp.persist().count()
,性能是相同的。@Blackishop它实际上改变了计数的性能。持久化数据帧不需要进行筛选和计数,只需要执行计数。情况越来越糟。您能在所做更改后发布输出吗?持久化(或缓存)方法返回一个新的DF。。改为使用
tmp=tmp.persist()
然后使用
tmp.count()
。@Blackishop在Python中,您不需要分配新变量,您可以使用相同的
tmp.persist().count()
,性能是相同的。@Blackishop它实际上改变了计数的性能。持久化数据帧不需要进行过滤和计数,而只需要执行计数。