在Databricks上使用pyspark / Delta湖泊,我有以下情形:
sdf = spark.read.format("delta").table("...")
result = sdf.filter(...).groupBy(...).agg(...)
analysis_1 = result.groupBy(...).count() # transformation performed here
analysis_2 = result.groupBy(...).count() # transformation performed here
据我所知,Spark与Delta湖有关,由于链式执行,result
实际上不是在声明时计算的,而是在使用时计算的。
但是,在此示例中,它被多次使用,因此,最昂贵的转换被多次计算。
是否可以在代码的某个位置强制执行,例如
sdf = spark.read.format("delta").table("...")
result = sdf.filter(...).groupBy(...).agg(...)
result.force() # transformation performed here??
analysis_1 = result.groupBy(...).count() # quick smaller transformation??
analysis_2 = result.groupBy(...).count() # quick smaller transformation??
答案 0 :(得分:0)
我认为问题无处不在,或者不清楚。但是,如果您是Spark的新手,那就可能是这种情况。
所以:
有关 .force 的使用,请参见https://blog.knoldus.com/getting-lazy-with-scala/。force不适用于数据集或数据框。
这与pyspark或Delta Lake方法有关吗?不,不。
analysis_1 = result.groupBy(...).count() # quick smaller transformation??
所以,我认为您的意思是我们尊敬的保险柜状态:
您需要我怀疑:
result.cache
这意味着您的第二次动作分析_2 无需重新计算以获取此处显示的来源
(2) Spark Jobs
Job 16 View(Stages: 3/3)
Stage 43:
8/8
succeeded / total tasks
Stage 44:
200/200
succeeded / total tasks
Stage 45:
1/1
succeeded / total tasks
Job 17 View(Stages: 2/2, 1 skipped)
Stage 46:
0/8
succeeded / total tasks skipped
Stage 47:
200/200
succeeded / total tasks
Stage 48:
1/1
succeeded / total tasks
通过对Spark进行的改进,混洗分区得以保留,在某些情况下,特别是对于RDD,也会导致跳过阶段。对于数据帧,需要缓存才能获得我观察到的跳过阶段效果。