首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取消Clojure序列的元组

取消Clojure序列的元组
EN

Stack Overflow用户
提问于 2015-09-09 03:42:09
回答 2查看 120关注 0票数 2

我有一个函数是与偏好脱节的,我想用flambo函数在clojure中实现该解决方案,因此:

  1. 从数据集(使用group-by )对重复项进行分组(即基于指定的:key)
  2. :val作为输入,使用filter检查每一行的某些值是否等于此:val
  3. 使用一个映射来untuple副本返回单个向量(不太确定这是否是正确的方法,我尝试使用flat-map没有任何运气)

对于一个样本数据集

代码语言:javascript
复制
(def rdd
   (f/parallelize sc [ ["Coke" "16" ""] ["Pepsi" "" "5"] ["Coke" "2" "3"] ["Coke" "" "36"] ["Pepsi" "" "34"] ["Pepsi" "25" "34"]]))

我试过这个:

代码语言:javascript
复制
(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))

因此,如果我运行这个函数:

代码语言:javascript
复制
(dedup-rows rdd {:key-col 0 :col 1 :val ""})

它产生

代码语言:javascript
复制
;=> [(["Pepsi" 25 34]), (["Coke" 16 ] ["Coke" 2 3])]]

我不知道还能做些什么来处理这个结果来产生一个

代码语言:javascript
复制
;=> [["Pepsi" 25 34],["Coke" 16 ],["Coke" 2 3]]

我尝试了f/map f/untuple作为->宏中的最后一种形式,但没有成功。

有什么建议吗?如果有别的办法,我会很感激的。谢谢。

PS:分组时

代码语言:javascript
复制
;=> [[["Pepsi" "" 5], ["Pepsi" "" 34], ["Pepsi" 25 34]], [["Coke" 16 ""], ["Coke" 2 3], ["Coke" "" 36]]]

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

EN

回答 2

Stack Overflow用户

发布于 2015-09-09 07:19:19

flambo自述中,有一个flat-map函数。这是有点不幸的命名,因为克洛尔的等价物叫做mapcat。这些函数接受每个映射结果(必须是一个序列),并将它们连接在一起。另一种思考它的方法是,它将最终的序列平缓一个层次。

我不能测试这个,但是我认为你应该用f/flat-map代替你的f/flat-map

票数 2
EN

Stack Overflow用户

发布于 2015-09-09 11:59:19

按照@TheQuickBrownFox的建议,我尝试了以下方法

代码语言:javascript
复制
(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))

而且看起来很管用

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32470528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档