更好的遍历地图地图的方法

时间:2012-06-21 13:16:33

标签: algorithm clojure jvm analytics

我正在做一些数据分析聚合,这是我的数据结构:

{
12300 {
   views {
       page-1 {
          link-2  40
          link-6  9
       }
       page-7 {
          link-3  9
          link-11 8
       }
   }
   buttons {
       page-1 {
          link-22 2
       }
   }
}
34000      ....
}

其中12300,34000是时间值。

我想要做的是遍历该数据结构并将条目插入数据库,如下所示:

insert into views (page, link, hits, time) values (page-1, link-2, 40, 12300)
insert into views (page, link, hits, time) values (page-1, link-6, 9, 12300)

编码的惯用方法是什么?我是否使数据结构复杂化?你建议任何更好的方法来收集数据吗?

2 个答案:

答案 0 :(得分:8)

假设你有一个来自clojure.java.jdbc的jdbc连接,这应该接近你想要的。

(jdbc/do-prepared "INSERT INTO views (page, link, hits, time) VALUES (?, ?, ?, ?)"
                  (for [[time data] m
                        [data-type page-data] data
                        [page links] page-data
                        [link hits] links]
                    [page link hits time]))
;; why aren't we using data-type, eg buttons?

编辑澄清问题

(let [m '{12300 {views {page-1 {link-2  40
                                link-6  9}
                        page-7 {link-3  9
                                link-11 8}}
                 buttons {page-1 {link-22 2}}}
          34000 {views {page-2 {link-2 5}}}}]
  (doseq [[table rows] (group-by :table (for [[time table] m
                                              [table-name page-data] table
                                              [page links] page-data
                                              [link hits] links]
                                          {:table table-name, :row [page link hits time]}))]
    (jdbc/do-prepared (format "INSERT INTO %s (page, link, hits, time) VALUES (?, ?, ?, ?)" table)
                      (map :row rows))))

答案 1 :(得分:2)

简单的解决方案:利用您使用地图的地图并使用get-in,assoc-in函数来查看/更改数据这一事实。请参阅以下示例:

http://clojuredocs.org/clojure_core/clojure.core/get-in http://clojuredocs.org/clojure_core/clojure.core/assoc-in

高级解决方案:使用功能性拉链。这允许您以功能方式遍历和更改树状结构。

这里有一个例子: http://en.wikibooks.org/wiki/Clojure_Programming/Examples/API_Examples/Advanced_Data_Structures#zipper

如果你有特殊的数据结构,而不是地图的地图,你可以通过简单地实现3种必需的方法自己创建拉链。之后,所有拉链功能也将适用于您的数据结构。

相关问题