使用clojure在flambo中使用zipWithUniqueId()

时间:2015-08-03 14:12:19

标签: clojure apache-spark flambo

我想创建一个rdd,使每行都有一个索引。我尝试了以下

鉴于rdd:

["a" "b" "c"] 

(defn make-row-index [input]
  (let [{:keys [col]} input]
    (swap! @rdd assoc :rdd (-> (:rdd xctx)
                          (f/map #(vector %1 %2 ) (range))))))

期望的输出:

 (["a" 0] ["b" 1] ["c" 2])

我遇到了arity错误,因为f / map用作(f/map rdd fn) 想在apache spark中使用zipWithUniqueId(),但是我对如何实现这一点感到迷茫,我无法在flambo中找到相同的功能。任何建议和帮助表示赞赏。

Apache-spark zip with Index

Map implementation in flambo

由于

1 个答案:

答案 0 :(得分:1)

您只需使用zipWithIndex拨打map,然后拨打untuple

(def rdd (f/parallelize sc ["a" "b" "c"]))
(f/map (.zipWithIndex rdd) f/untuple)

您可以使用.zipWithUniqueId完全相同的方式,但结果会与您的预期不同。 zipWithUniqueId将生成对,但索引字段不会被订购。

也可以使用zip,但据我所知,它无法使用无限范围。

(def idx (f/parallelize sc (range (f/count rdd))))
(f/map (.zip rdd idx) f/untuple)

每当你使用zip时,你应该小心,但一般来说,如果涉及洗牌,RDD应被视为无序集合。