根据火花DAG,在阶段0执行groupBy之后,在第1阶段执行groupBy。我的代码中只有一个groupBy,不会期望我正在进行的任何其他转换都会导致一个groupBy。
下面是代码(clojure / flambo):
;; stage 0
(-> (.textFile sc path 8192)
(f/map (f/fn [msg] (json/parse-string msg true)))
(f/group-by (f/fn [msg] (:mmsi msg)) 8192)
;; stage 1
(f/map-values (f/fn [values] (sort-by :timestamp (vec values))))
(f/flat-map (ft/key-val-fn (f/fn [mmsi messages]
(let [state-map (atom {}) draught-map (atom {})]
(map #(mk-line % state-map draught-map) (vec messages))))))
(f/map (f/fn [line] (json/generate-string line)))
(f/save-as-text-file path)))在我看来,第0阶段是textFile,map,groupBy,第1阶段是map-values,map-values,flat-map,map,saveAsTextFile,但是第1阶段的groupBy是从哪里来的呢?

由于groupBy会导致洗牌,这在计算上很昂贵,而且耗费时间,所以如果可以帮助的话,我不想要额外的洗牌。
发布于 2016-01-05 13:28:40
这里没有多余的groupBy。groupBy是一个两步的过程.第一步是本地map,它从x转换为(f(x), x)。这是第0阶段中表示为groupBy块的部分。
第二步是非局部groupByKey,它在第1阶段被标记为groupBy块,只有这一部分需要洗牌。
https://stackoverflow.com/questions/32635459
复制相似问题