【发布时间】:2015-09-09 19:59:19
【问题描述】:
我有一个优先删除重复数据的函数,因此我想到了使用 flambo 函数在 clojure 中实现该解决方案:
从数据集中,使用
group-by,对重复项进行分组(即基于指定的:key)给定
:val作为输入,使用filter检查每行的某些值是否等于:val使用映射到
untuple重复项以返回单个向量(虽然不太确定这是否正确,但我尝试使用flat-map没有任何运气)
对于示例数据集
(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]]]
对于每个组,具有"" 的行被认为是重复的,因此会从组中删除。
【问题讨论】:
-
@zero323,请帮我解决这个问题。谢谢!