我是新手,可以在这里使用一些指导。 我们有一些基本代码可读取到csv中,将其缓存并输出到镶木地板中:
1. val df=sparkSession.read.options(options).schema(schema).csv(path)
2. val dfCached = df.withColumn()....orderBy(some Col).cache()
3. dfCached.write.partitionBy(partitioning).parquet(outputPath)
AFAIK,一旦我们调用Parquet调用(一个动作),则应在执行该动作之前执行cache命令以保存DF的状态。
在spark用户界面中,我看到:
cache
调用的单阶段作业parquet
调用的作业。这项工作分为两个阶段。 1似乎在重复缓存步骤,第二个执行到拼花的转换。 (请参见下图)为什么我同时拥有一个缓存作业和一个缓存阶段?我希望只有一个或另一个缓存,但似乎我们在这里缓存了两次。
答案 0 :(得分:0)
我不确定100%,但似乎正在发生以下情况:
加载csv数据时,它会在辅助节点之间分配。我们调用cache(),每个节点将接收到的数据存储在内存中。这是第一个缓存作业。
当我们调用partitionBy(...)
时,需要根据传递给函数的args在不同的执行程序之间重新组合数据。由于我们正在缓存数据,并且数据已从一个执行程序转移到另一个执行程序,因此我们需要重新缓存重新整理的数据。可以确认是因为第二个缓存阶段显示了一些随机写入数据。此外,缓存阶段显示的任务要少于初始缓存任务。可能是因为只需要重新整理数据,而不是整个数据帧。
镶木地板阶段被调用。我们可以看到一些随机读取的数据,这些数据显示执行者正在读取新的随机数据。