Clojure spark-DAG中的无关groupBy
根据spark DAG可视化,在第0阶段执行Clojure spark-DAG中的无关groupBy,clojure,apache-spark,flambo,Clojure,Apache Spark,Flambo,根据spark DAG可视化,在第0阶段执行groupBy之后,在第1阶段执行groupBy。我的代码中只有一个groupBy,我不希望我正在进行的任何其他转换会产生groupBy 下面是代码(clojure/flambo): 我很清楚,第0阶段是序列textFile,map,groupBy,第1阶段是map value,map value,平面图,map,saveAsTextFile,但是第1阶段中的groupBy来自哪里 由于groupBy会导致一次洗牌,这在计算上既昂贵又耗时,如果可以帮
groupBy
之后,在第1阶段执行groupBy
。我的代码中只有一个groupBy
,我不希望我正在进行的任何其他转换会产生groupBy
下面是代码(clojure
/flambo
):
我很清楚,第0阶段是序列textFile
,map
,groupBy
,第1阶段是map value
,map value
,平面图
,map
,saveAsTextFile
,但是第1阶段中的groupBy
来自哪里
由于
groupBy
会导致一次洗牌,这在计算上既昂贵又耗时,如果可以帮助的话,我不想要一次无关的洗牌。这里没有无关的groupBy<代码>分组方式是一个分两步的过程。第一步是本地映射
,它从x
转换为(f(x),x)
。这是在阶段0中表示为groupBy
块的部分
第二步是非本地groupByKey
,它在阶段1中标记为groupBy
块。只有这一部分需要洗牌
;; 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)))