pyspark df.count()需要很长时间(或根本无法工作)

时间:2018-10-16 15:19:07

标签: 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.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']])

df11,862,412,799行,df28679

然后我打电话给我

df3.count()

似乎和以下内容一起坐在那里

[Stage 33:>                                                     (0 + 200) / 200]

1 个答案:

答案 0 :(得分:1)

此答案的假设:

  • df1是包含1,862,412,799行的数据框。
  • df2是包含8679行的数据框。
  • df1.count()快速返回一个值(根据您的评论)

可能在三个区域发生减速:

数据大小的不平衡(1,862,412,799与8679):

尽管spark在处理大量数据方面令人惊叹,但在处理非常小的数据集时效果不佳。如果没有特别设置,Spark会尝试将您的数据分为多个部分,在小文件上,与每个部分的实际数据量相比,这可能会过高。我建议尝试使用以下内容,看看它是否可以提高速度。

df2 = spark.read.csv("/location/mydata2")
df2 = df2.repartition(2)

注意:这里的数字2只是一个估计数字,它取决于有多少个分区适合该集合中的行数。

广播费用:

计数延迟可能是由于实际广播步骤引起的。在连接之前,您的数据将被保存并复制到集群中的每个节点,一旦调用count(),所有这些都会一起发生。根据您的基础架构,这可能需要一些时间。如果以上分区不起作用,请尝试删除广播呼叫。如果最终导致延迟,那么最好确认集群中是否没有瓶颈,或者是否有必要。

意外合并爆炸

我并不是说这是一个问题,但是最好检查您设置的合并条件没有创建意外的重复项。在执行df3的处理时,可能会发生这种情况,并导致您遇到的速度变慢。