Apache spark 如果两个阶段使用相同的RDD,spark是否读取相同的文件两次?
在Spark中,以下代码Apache spark 如果两个阶段使用相同的RDD,spark是否读取相同的文件两次?,apache-spark,Apache Spark,在Spark中,以下代码 rdd = sc.textfile("file path") rdd1 = rdd.filter(filter1).maptopair(); rdd2 = rdd.filter(filter2).maptopair(); rdd3 = rdd1.join(rdd2); rdd3.saveastextfile(); 将生成3个阶段。从Spark Web UI中,我看到第1阶段和第2阶段并行运行,前两个阶段完成后将触发join阶段(第3阶段)。 我的问题是阶段1和阶段2同
rdd = sc.textfile("file path")
rdd1 = rdd.filter(filter1).maptopair();
rdd2 = rdd.filter(filter2).maptopair();
rdd3 = rdd1.join(rdd2);
rdd3.saveastextfile();
将生成3个阶段。从Spark Web UI中,我看到第1阶段和第2阶段并行运行,前两个阶段完成后将触发join阶段(第3阶段)。
我的问题是阶段1和阶段2同时读取同一个文件?
这意味着Spark将同一文件读取两次?TL;博士是的,它会读两遍 较长的答案是,如果初始读取已经在内存(缓存/OS缓存)中,那么它将通过直接读取来使用它。如果不深入研究实现,您的特定场景很可能会导致同时读取。也就是说,这正是创建数据帧的原因。代码是一个黑盒子,因此除了部分共享的沿袭之外,整个阶段(read和map*)就调度程序而言是不同的。而且,如前所述,它将在可能的情况下重用任何已经缓存的沿袭 如果您想要更共享的东西,请使用DataFrames和它对完整沿袭的深入了解,以及它可以从合并操作中获益的地方。例如,如果您获取代码并通过SQL将其推送,那么您将看到正在寻找的合并
*我想你的意思是
map
而不是filter
,因为join
否则不会起作用。好吧,除了此代码之外的性能在运行时或编译过程中都会失败。如果你使用2个filter
操作,那么这可以组合成一个步骤,而无需join