2

私はいくつかのデータ分析集計を行っています。これが私のデータ構造です。

{
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)

それをコーディングする慣用的な方法は何でしょうか? データ構造を複雑にしていますか? データを収集するためのより良い方法を提案していますか?

4

2 に答える 2

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))))
于 2012-06-21T19:11:40.223 に答える
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つのメソッドを実装するだけで、自分でジッパーを作成できます。その後、すべてのジッパー機能がデータ構造でも機能します。

于 2012-06-21T14:14:21.193 に答える