我有一个优先重复删除的功能,我想用clombo函数实现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]]]
对于每个组,具有""
的行被视为重复行,因此从组中删除。
答案 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))
似乎有效