我有一个函数是与偏好脱节的,我想用flambo函数在clojure中实现该解决方案,因此:
group-by )对重复项进行分组(即基于指定的:key):val作为输入,使用filter检查每一行的某些值是否等于此:valuntuple副本返回单个向量(不太确定这是否是正确的方法,我尝试使用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]]]对于每个组,具有""的行被认为是重复的,因此从组中删除。
发布于 2015-09-09 07:19:19
在flambo自述中,有一个flat-map函数。这是有点不幸的命名,因为克洛尔的等价物叫做mapcat。这些函数接受每个映射结果(必须是一个序列),并将它们连接在一起。另一种思考它的方法是,它将最终的序列平缓一个层次。
我不能测试这个,但是我认为你应该用f/flat-map代替你的f/flat-map。
发布于 2015-09-09 11:59:19
按照@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))而且看起来很管用
https://stackoverflow.com/questions/32470528
复制相似问题