在Spark中,以下代码
rdd = sc.textfile("file path")
rdd1 = rdd.filter(filter1).maptopair();
rdd2 = rdd.filter(filter2).maptopair();
rdd3 = rdd1.join(rdd2);
rdd3.saveastextfile();将产生3个阶段。从Spark中,我看到第1阶段和第2阶段并行运行,在完成前两个阶段之后将触发连接阶段(第3阶段)。我的问题是第一阶段和第二阶段同时读取同一文件?也就是说斯派克读了同一份文件两次?
发布于 2016-06-18 14:47:24
是的,它会读两遍。
更长的答案是,如果初始读取已经在内存中(缓存/OS缓存),那么它将使用直接读取。如果不深入研究实现,那么您的特定场景很可能导致同时读取。尽管如此,原因恰恰是创建DataFrames的原因。代码是一个黑匣子,所以对于调度程序来说,除了部分共享的沿袭之外,整个阶段(read和map*)是不同的。而且,如前所述,如果可以,它将重用任何已经缓存的沿袭。
如果您想要更多的共享,请使用DataFrames,它非常了解整个血统,以及它可以从合并操作中获益的地方。例如,如果您使用您的代码并将其推送到SQL中,那么您将看到您正在寻找的合并。
*我猜您的意思是map而不是filter,因为join不起作用。
https://stackoverflow.com/questions/37894099
复制相似问题