我正在做一些数据分析聚合,下面是我的数据结构:
{
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)对此进行编码的惯用方法是什么?我是不是让数据结构复杂化了?你有没有更好的收集数据的方法?
发布于 2012-06-22 03:11:40
假设您有一个来自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))))发布于 2012-06-21 22:14:21
简单的解决方案:利用您正在使用地图的事实,并使用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
如果您有特殊的数据结构,而不是map的map,那么您可以通过简单地实现3个必需的方法来自己创建一个拉链。在那之后,所有的zipper函数也将在你的数据结构上工作。
https://stackoverflow.com/questions/11139041
复制相似问题