在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阶段正在并行运行,并且在前两个完成后将触发连接阶段(阶段3)。 我的问题是第1阶段和第2阶段同时读取同一个文件? 这意味着Spark两次读取同一个文件?
答案 0 :(得分:2)
TL; DR;是的它会读两遍。
更长的答案是,如果初始读取已经在内存中(缓存/操作系统缓存),那么它将通过直接读取使用它。如果不深入了解实现,您的特定方案最有可能导致同时读取。也就是说,原因正是DataFrames创建的原因。代码是一个黑盒子,因此除了部分共享的谱系之外,整个阶段(读取和映射*)就调度程序而言是不同的。并且,正如已经提到的,它将重用已经缓存的任何谱系,它可以。
如果您想要更多共享内容,请使用DataFrames及其对完整血统的深入了解以及它可以从合并操作中受益。例如,如果您获取代码并通过SQL推送它,那么您将看到正在寻找的合并。
*我认为您的意思是map
而不是filter
,因为join
不会起作用。