根据spark DAG vizualization,在阶段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
,{{1} },flat-map
,map
,但第1阶段的saveAsTextFile
来自哪里?
由于groupBy
引起了一次计算成本高且耗时的洗牌,如果可以帮助的话我不想要一个无关的。
答案 0 :(得分:1)
这里没有无关的群体。 groupBy
分为两个步骤。第一步是本地map
,它从x
转换为(f(x), x)
。这是在阶段0中表示为groupBy
块的部分。
第二步是非本地groupByKey
,在第1阶段标记为groupBy
块。只有这部分需要改组。