我有以下代码,它们只是简单地进行一些联接,然后输出数据;
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
是1,862,412,799
行,df2
是8679
行
然后我打电话给我
df3.count()
似乎和以下内容一起坐在那里
[Stage 33:> (0 + 200) / 200]
答案 0 :(得分:1)
此答案的假设:
可能在三个区域发生减速:
数据大小的不平衡(1,862,412,799与8679):
尽管spark在处理大量数据方面令人惊叹,但在处理非常小的数据集时效果不佳。如果没有特别设置,Spark会尝试将您的数据分为多个部分,在小文件上,与每个部分的实际数据量相比,这可能会过高。我建议尝试使用以下内容,看看它是否可以提高速度。
df2 = spark.read.csv("/location/mydata2")
df2 = df2.repartition(2)
注意:这里的数字2只是一个估计数字,它取决于有多少个分区适合该集合中的行数。
广播费用:
计数延迟可能是由于实际广播步骤引起的。在连接之前,您的数据将被保存并复制到集群中的每个节点,一旦调用count(),所有这些都会一起发生。根据您的基础架构,这可能需要一些时间。如果以上分区不起作用,请尝试删除广播呼叫。如果最终导致延迟,那么最好确认集群中是否没有瓶颈,或者是否有必要。
意外合并爆炸
我并不是说这是一个问题,但是最好检查您设置的合并条件没有创建意外的重复项。在执行df3的处理时,可能会发生这种情况,并导致您遇到的速度变慢。