解开Clojure序列

时间:2015-09-09 03:42:09

标签: clojure rdd flambo

我有一个优先重复删除的功能,我想用clombo函数实现clojure中的解决方案:

  1. 从数据集中,使用group-by,对重复项进行分组(即基于指定的:key

  2. 给定:val作为输入,使用filter检查每行的某些值是否等于此:val

  3. 使用地图untuple重复项返回单个向量(不太确定,如果这是正确的方式,我尝试使用flat-map没有任何运气)

  4. 对于样本数据集

    (def rdd
       (f/parallelize sc [ ["Coke" "16" ""] ["Pepsi" "" "5"] ["Coke" "2" "3"] ["Coke" "" "36"] ["Pepsi" "" "34"] ["Pepsi" "25" "34"]]))
    

    我试过了:

    (defn dedup-rows
     [rows input]
     (let [{:keys [key-col col val]} input  
          result (-> rows
                   (f/group-by (f/fn [row]
                                (get row key-col)))
                  (f/values)
                  (f/map (f/fn [rows]
                    (if (= (count rows) 1)
                      rows
                      (filter (fn [row]
                                (let [col-val (get row col)
                                      equal? (= col-val val)]
                                  (if (not equal?)
                                   true
                                   false))) rows)))))]
        result))
    

    如果我这样运行这个功能:

    (dedup-rows rdd {:key-col 0 :col 1 :val ""})
    

    它产生

    ;=> [(["Pepsi" 25 34]), (["Coke" 16 ] ["Coke" 2 3])]]
    

    我不知道如何处理结果以产生

    的结果
    ;=> [["Pepsi" 25 34],["Coke" 16 ],["Coke" 2 3]]
    

    我尝试f/map f/untuple作为->宏中的最后一个表单而没有运气。

    有什么建议吗?如果有另一种方法可以解决这个问题,我将非常感激。 感谢。

    PS:分组时

    ;=> [[["Pepsi" "" 5], ["Pepsi" "" 34], ["Pepsi" 25 34]], [["Coke" 16 ""], ["Coke" 2 3], ["Coke" "" 36]]]
    

    对于每个组,具有""的行被视为重复行,因此从组中删除。

1 个答案:

答案 0 :(得分:1)

按@TheQuickBrownFox建议,我尝试了以下

(defn dedup-rows
[rows input]
(let [{:keys [key-col col val]} input  
  result (-> rows
           (f/group-by (f/fn [row]
                        (get row key-col)))
          (f/values)
          (f/map (f/fn [rows]
            (if (= (count rows) 1)
              rows
              (filter (fn [row]
                        (let [col-val (get row col)
                              equal? (= col-val val)]
                          (if (not equal?)
                           true
                           false))) rows)))
           (f/flat-map (f/fn [row]
                           (mapcat vector row)))))]
  result))

似乎有效