Apache spark pyspark df.count()需要很长时间(或者根本不工作)
我有下面的代码,只是做一些连接,然后输出数据Apache spark pyspark df.count()需要很长时间(或者根本不工作),apache-spark,count,pyspark,Apache Spark,Count,Pyspark,我有下面的代码,只是做一些连接,然后输出数据 from pyspark.sql.functions import udf, struct from pyspark import SparkContext from pyspark.sql import SparkSession from pyspark import SparkConf from pyspark.sql.functions import broadcast conf = SparkConf() conf.set('spark.l
from pyspark.sql.functions import udf, struct
from pyspark import SparkContext
from pyspark.sql import SparkSession
from pyspark import SparkConf
from pyspark.sql.functions import broadcast
conf = SparkConf()
conf.set('spark.logConf', 'true')
spark = SparkSession \
.builder \
.config(conf=conf) \
.appName("Generate Parameters") \
.getOrCreate()
spark.sparkContext.setLogLevel("OFF")
df1 = spark.read.parquet("/location/mydata")
df1 = df1.select([c for c in df1.columns if c in ['sender','receiver','ccc,'cc','pr']])
df2 = spark.read.csv("/location/mydata2")
cond1 = [(df1.sender == df2._c1) | (df1.receiver == df2._c1)]
df3 = df1.join(broadcast(df2), cond1)
df3 = df3.select([c for c in df3.columns if c in['sender','receiver','ccc','cc','pr']])
df1
是1862412799
行,而df2
是8679
行
当我打电话时
df3.count()
它似乎只是坐在那里与以下内容
[Stage 33:> (0 + 200) / 200]
此答案的假设:
- df1是包含1862412799行的数据帧
- df2是包含8679行的数据帧
- df1.count()快速返回值(根据您的注释)
df2 = spark.read.csv("/location/mydata2")
df2 = df2.repartition(2)
注意:这里的数字2只是一个估计的数字,基于多少分区适合该集中的行数
广播成本:
计数延迟可能是由于实际的广播步骤造成的。在加入之前,您的数据将被保存并复制到集群中的每个节点,一旦调用count(),所有这些都将同时发生。根据您的基础设施,这可能需要一些时间。如果上述重新分区不起作用,请尝试删除广播呼叫。如果这就是延迟,那么最好确认集群中没有瓶颈,或者如果有必要的话
意外的合并爆炸
我并不暗示这是一个问题,但是检查您设置的合并条件是否没有创建意外的重复项总是好的。这种情况很可能正在发生,并造成您在处理df3时遇到的速度减慢。问题是,只需一秒钟就可以计算
1862412799
行,df3应该更小。还有一种连接操作也很有意义df3=df1.join(broadcast(df2),cond1)
。该阶段已完成。这只是一个永远需要完成的计数。事实上,count()是一个懒惰的操作。您正在运行单节点群集吗?确定。在这种情况下,我如何查看df3中的记录数?我在一个边缘上运行这个nodeThanks!我发生了意外的合并爆炸。