Post on 24-Jun-2015
description
BigData avec Incanter et ClojureJUG Summer Camp 2012
Claude Falguière @cfalguiere
goo.gl/4mmJQ1
1jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
AU PROGRAMME
2
Lire et explorer des données
Faire un job MapReduce Hadoop
Générer un rapport HTML
Stocker les données dans MongoDB
Construire un projet Clojure
avec Clojure
2jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
VOTRE MISSION SI VOUS L’ACCEPTEZ ...
3
filtrage des erreurstransformer les donnéesregrouper par catégories
charts, distributions, corrélations
500 utilisateurs x 5h de test environ 1 000 000 relevés
rapports d’analyse de tests de performance
3jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
INCANTER
4
+=Math, Stats, Graps
4jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
INCANTER
5
DSL
manipulation de matrices et tables
statistiquescharts
modèlestest d’hypothèse
5jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
INCANTER
6
Motivation pour se mettre à Clojure Langage Fonctionnel
Ecosystème JavaNetlib
Parallel ColtJFreeChart
6jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
CLAUDE FALGUIERE
@cfalguiere
7
goo.gl/4mmJQ
http://cfalguiere.wordpress.com
7jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
ET VOUS ?
8
? ? ?
8jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere9
Petit rappel Clojure
9jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
HELLO WORLD
10
(def conference "JUG Summer Camps")(println "Hello" conference)
(println "Hello JUG Summer Camp")
(count (str "Hello" conference))
-> "Hello JUG Summer Camp"
10jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
LES NOMBRES
11
(+ 1 2 3) -> 7
(= 2 (+ 1 1)) -> true
(+ 4 (* 2 3)) -> 10
11jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
Lire et explorer des données
12
12jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
SE LANCER
13
La voie du novice
1) downloader Incanter
2) lancer le REPL
13jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
LES EXEMPLES
14
https://github.com/cfalguiere/ClojureBigDataJugSummerCamp2012
14jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
PREMIER SCRIPT
15
15jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
LIRE DES DONNÉES
16
(def ds (read-dataset "readings.csv" :header true))
équivalent pour Excel
(use '(incanter core io stats charts))
(save ds "./data.csv")
16jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
LES COLLECTIONS
17
(def colors ["red" "magenta" "orange"])
(def colors ‘("red" "magenta" "orange"))
,
(def colors #{"red" "magenta" "orange"})
Clojure
17jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
LES COLLECTIONS
18
MatrixDataset
Incanter
18jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
LES MAPS
19
(def conf {:name "JUG Summer Camp" :location "La Rochelle" })
,
Clojure
19jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
JEU DE DONNÉES
20
t lb ts s rc shop srch userId ...
754 "SU01-HomePage-Page" 1330419301862 "true" 200 "MAF" "gants" "PT1022809551"
20jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
LES COLONNES
21
user>($ :t ds)
user> (mean ($ :t ds)) 994,75
21jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
QUANTILE 95%
22
(quantile ($ :t ds) :probs [0.95])
Temps maximum pour 95% des relevés
911.1758241758242
22jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
($ [:lb :t :shop] ds )
LES COLONNES
23
(view ($ [:lb :t :shop] ds )) ->
23jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
LES LIGNES
24
($where {:s "true"} ds) -> les lignes OK
24jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
($where {:s "true" ds)
LES LIGNES
25
($where {:s "true" :shop {:$in #{"MAF", "FAB"}} ds)
($where {:s "true" :shop {:$in #{"MAF", "FAB"}} :t {:$gt 3000 :$lt 5000}} ds)
25jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
WITH-DATA
26
($where {:shop "MAF"} ds)
($ :t ($where {:shop "MAF"} ds))
(view ($ :t ($where {:shop "MAF"} ds)))
(with-data ds
(view ($ :t ($where {:shop "MAF"} ))))ds
26jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
INCANTER CHARTS
27
Time-series
Histograms
Bar charts
Box Plot
Scatter Plot
27jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
(time-series-plot :ts :t :data ds)
(view (time-series-plot :ts :t :data ds))
(view (time-series-plot :ts :t :data ds :title "Readings" :x-label "time" :y-label "resp. time (ms)" :legend true :series-label "duration ms"))
28jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
(time-series-plot :ts :t :data ds :title "Readings" :x-label "time" :y-label "resp. time (ms)" :legend true :series-label "duration ms" )
29
(doto (time-series-plot :ts :t :data ds :title "Readings" :x-label "time" :y-label "resp. time (ms)" :legend true :series-label "duration ms" ) (add-lines ts (repeat 3000) :series-label "threshold") (set-stroke-color java.awt.Color/blue :series 0) (set-stroke :width 1 :series 0) (set-stroke-color java.awt.Color/red :series 1) (set-stroke :width 3 :series 1) view)
29jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
(time-series-plot :ts :t :data ds :title "Readings" :x-label "time" :y-label "resp. time (ms)" :legend true :series-label "duration ms" )
(time-series-plot...
DOTO
30
(add-lines (time-series-plot...
(set-stroke-color (add-lines (time-series-plot...
(view (set-stroke-color (add-lines (time-series-plot...
(time-series-plot :ts :t :data ds :title "Readings" :x-label "time" :y-label "resp. time (ms)" :legend true :series-label "duration ms" ) (add-lines ts (repeat 3000) :series-label "threshold")
(time-series-plot :ts :t :data ds :title "Readings" :x-label "time" :y-label "resp. time (ms)" :legend true :series-label "duration ms" ) (add-lines ts (repeat 3000) :series-label "threshold") (set-stroke-color java.awt.Color/blue :series 0)
(time-series-plot :ts :t :data ds :title "Readings" :x-label "time" :y-label "resp. time (ms)" :legend true :series-label "duration ms" ) (add-lines ts (repeat 3000) :series-label "threshold") (set-stroke-color java.awt.Color/blue :series 0) view
(doto (time-series-plot :ts :t :data ds :title "Readings" :x-label "time" :y-label "resp. time (ms)" :legend true :series-label "duration ms" ) (add-lines ts (repeat 3000) :series-label "threshold") (set-stroke-color java.awt.Color/blue :series 0) view)
30jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
REGROUPEMENT
31
(def groups ($group-by :shop ds))
{ "MAF" "FAB" }{ {:shop "MAF"} {:shop "FAB"} }
31jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
(get groups {:shop "MAF"})
LIRE UN GROUPE
32
32jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
$ROLLUP
33
user> ($rollup count :t :shop ds)
Applique une fonction à chaque entrée d’un $group-by
fonction regroupement[:shop :t]["MSK" 170]["KIE" 76]["OIB" 342]["FAB" 171]...
33jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
MOYENNE
34
user> ($rollup mean :t :lb ds)
Moyenne par groupe
[:lb :t]["SU61-BrowseCat2-Page" 911.1758241758242]["SU43-Paiment-Page" 1770.6004566210045]["SU42-DeliveryAndBilling-Page" 732.0340136054422]["SU41-CustomerDetails-Page" 608.2222222222222]...
34jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
($rollup count :t :shop ds)
user>(view (bar-chart :shop :t :vertical false :data ($rollup count :t :shop ds)))
DIAGRAMMES EN BARRES
35
35jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
(histogram :t :data ds)
ENREGISTRER LES CHARTS
36
(save (histogram :t :data ds) "histogram.png")
36jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
REJOUER LE SCRIPT
37
(use '(incanter core io stats charts))(def ds (read-dataset "../data/readings.csv" :header true) )(save (histogram :ts :t :data ds) "histogram.png")(println ($rollup mean :t :lb ds))
analyse.clj
user>(load-file "analyse.clj")
37jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
ET ENSUITE ...
38
Les limitations du REPL seul- difficile d’écrire des commandes complexes- pas de tests unitaires - que les libs fournies dans l’uberjar incanter
lein ...
38jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere39
Construire un projet Clojure
39jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
L’ECOSYSTEME CLOJURE
40
build et gestion de dépendance lein (leiningen)
repos Mavenclojars, sonatype
tests unitairesclojure.test (built-in), midge
intégration avec les IDEswank, jark
40jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
L’ATELIER
41
REPL + editeur de texteou
Emacs + Slime + SwankEclipse + CounterClockWiseIDEA + La Clojure + LeiningenNetbeans + EnclojureVim + VimClojure
41jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
SE LANCER
42
La voie du gourou
installer leiningen
lein new myproject
configurer project.clj
lein <task>
42jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
NEW
43
demo classes lib project.clj src demo core.clj test demo test core.clj
demo classes lib project.clj src demo core.clj test demo test core.clj
43jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
(defproject demo "1.0.0-SNAPSHOT" :description "demos incanter " )
PROJECT.CLJ
44
(defproject demo "1.0.0-SNAPSHOT" :description "demos incanter" :dependencies [[org.clojure/clojure "1.3.0"] [incanter "1.3.0"] ] )
(defproject demo "1.0.0-SNAPSHOT" :description "demos incanter" :dependencies [[org.clojure/clojure "1.3.0"] [incanter "1.3.0"] ] :dev-dependencies [[swank-clojure "1.4.2"]])
44jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
myproject classes lib project.clj
.m2 repository
DEPENDANCES
45
>lein deps
Clojars
Sonatype.m2 repository incanter incanter 1.3.0 incanter-1.3.0.jar
demo classes lib incanter-1.3.0.jar project.clj
45jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
TEST UNITAIRES
46
(deftest test-f1 (is 6 (f1 3)))
(defn f1 [s] (* 2 s))
clojure.test (built-in)
46jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
NAMESPACES
47
(ns demo.test.core (:use demo.core) (:use clojure.test))
(deftest test-f1 (is 6 (f1 3)))
(ns demo.core)
(defn f1 [s] (* 2 s))
demo classes lib project.clj src demo core.clj test demo test core.clj
47jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
RECHERCHER PAR DATE
48
user> (view ($where {:timestamp {:$gt start-time :$lt end-time}} ds)) user> (let [ start-time end-time ] (view ($where {:timestamp {:$gt start-time :$lt end-time}} ds)))
user> (let [ start-time (date-time 2012 02 28 8 55) ] (view ($where {:timestamp {:$gt start-time :$lt end-time}} ds)))
user> (let [ start-time (date-time 2012 02 28 8 55) end-time (date-time 2012 02 28 8 57) ] (view ($where {:timestamp {:$gt start-time :$lt end-time}} ds)))
(ns demo.utils (:use [clj-time.core :only date-time]) )
48jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
TEST TIME
49
(deftest test-readable-timestamp (is ) )
(deftest test-readable-timestamp (is (= 2012 (year adate ))) )
(deftest test-readable-timestamp (let [ result (readable-timestamp ds) ] (is (= 2012 (year (sel result :rows 0 :cols :timestamp ))))))
(deftest test-readable-timestamp (let [ ds (dataset [:ts] [{:ts 1330418007548} {:ts 1330418007549}]) result (readable-timestamp ds) ] (is (= 2012 (year (sel result :rows 0 :cols :timestamp ))))))
49jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
MAPPER UNE COLONNE
50
($map fct-to-date :ts ds )
50jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
CLJ-TIME (JODA)
51
(coerce/from-long 1330418007548)
#<Date Tue Feb 28 09:33:27 CET 2012>
(ns demo.utils (:require [clj-time.coerce :as coerce]) )
51jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
($map :ts ds ) ($map #(coerce/from-long %) :ts ds )
MAPPER UNE COLONNE
52
fonction anonyme
arg
52jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
AUGMENTER LE DATASET
53
($map #(coerce/from-long %) :ts ds )
(dataset [:timestamp]
($map #(coerce/from-long %) :ts ds ))
(conj-cols ds (dataset [:timestamp]
($map #(coerce/from-long %) :ts ds )))
(defn readable-timestamp [ds] (conj-cols ds (dataset [:timestamp]
($map #(coerce/from-long %) :ts ds ))))
53jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
LEIN TEST
54
>lein test Testing loaderdemo.test.jmeterloaderRan 3 tests containing 5 assertions.0 failures, 0 errors.Testing loaderdemo.test.xmlloaderRan 5 tests containing 13 assertions.0 failures, 0 errors.Testing loaderdemo.test.coreTesting loaderdemo.test.jmeterloaderTesting loaderdemo.test.xmlloaderRan 9 tests containing 19 assertions.0 failures, 0 errors.
54jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
SCRIPT
55
(ns demo.core:use [[incanter.core] [demo.utils]] ;; readable-timestamp:require [[incanter.io :as io]
[incanter.stats :as stats][incanter.charts :as charts]])
(let [ds (readable-timestamp(io/read-dataset "readings.csv"))](save (charts/time-series-plot :ts :t :data ds) "times.png")(println ($rollup mean :t :lb ds)))
demo/core.clj
55jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
MAIN
56
(ns demo.core:use [[incanter.core] [demo.utils]] ;; readable-timestamp:require [[incanter.io :as io]
[incanter.stats :as stats][incanter.charts :as charts]])
(defn -main [& args] (let [ds (readable-timestamp(io/read-dataset "readings.csv"))] (save (charts/time-series-plot :ts :t :data ds) "times.png")(println ($rollup mean :t :lb ds)))
lein runNo :main namespace specified in project.clj.
demo/core.clj
56jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
LEIN RUN
57
(defproject demo "1.0.0-SNAPSHOT" :description "demos incanter" :dependencies ... :dev-dependencies ... :main demo.core)
lein runread 1738
57jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
LEIN REPL
58
lein replREPL started; server listening on localhost port 61426demo.core=>
58jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
LES GRIMOIRES
59
incanter.orgdata-sorcery.org
github.com/liebke/incanter
Incanter sur StackoverflowIncanter Google Group
59jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere60
Stocker les données
60jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
ARCHITECTURE
61
Clojure
Document
CongoMongo
Incanter.mongodb
MongoDBServer
61jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
SE CONNECTER
62
(ns dm (:require [somnium.congomongo :as cm] [incanter.core :as incanter] [incanter.mongodb :as im]))
(def conn (cm/make-connection :demodb))
#'demomongo/conn
62jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
(im/insert-dataset :readings ds)
MASS INSERT
63
(cm/with-mongo conn (im/insert-dataset :readings ds))
({:ts "1330419301862", :search__phrase "gants", :userId "PT1022809551", ...
63jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
DANS MONGO
64
mongoconnecting to: test> show dbsdemodb 0.203125GBlocal (empty)
{ "_id" : ObjectId("5034e71703643050fef59474"), "ts" : "1330419324275", "search__phrase" : "gants", "userId" : "PT1022809551", "hrts" : "2012-02-28T08:55:24.275Z", "rc" : NumberLong(200), "productId" : "8519304225180894762", "shop" : "MAF", "lb" : "SU12b-PickProduct-Page", "t" : NumberLong(1177), "s" : "true" }...
db.readings.find( {'lb':'SU12b-PickProduct-Page', 'shop':'MAF', 'search__phrase:‘gants’} )
64jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
LIRE
65
(im/fetch-dataset :readings ))
(cm/fetch :readings :where {:shop "MAF"} )
({:ts "1330419301862", :search__phrase "gants", :userId "PT1022809551", :hrts "2012-02-28T08:55:01.862Z", ...
65jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
JDBC
66
pas d’intégration Incanter JDBC
des librairies Clojureclojure.java.jdbcKormaClojureQL
66jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere67
Générer un rapport HTML
67jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
LE WEB ET CLOJURE
68
Ring
Moustache ou Compojure
Enlive ou Hiccup
68jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
LE RAPPORT
69
69jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
HICCUP
70
(ns hiccupdemo.core (:use hiccup.core) (:use hiccup.page) (:use hiccup.element)
70jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
(defn build-table [{:keys [rows]}] (html ))
FORMATER LA TABLE
71
(defn build-table [{:keys [rows]}] (html [:table ]))
(defn build-table [{:keys [rows]}] (html [:table (table-headers) (map table-row rows) ]))
71jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
(defn table-row [{:keys [lb count mean min max q95]}] (html [:tr [:td lb] [:td {:class "number"} count] [:td {:class "number"} mean ] ... ]]))
FORMATER LA LIGNE
72
(defn table-row [{:keys [lb count mean min max q95]}] (html [:tr [:td lb] [:td {:class "number"} count] [:td {:class "number"} (format "%6.2f" mean)]... ]]))
72jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
DESTRUCTURINGDE MAP
73
(defn build-table [statsds] (html [:table (table-headers) (map table-row (:rows statsds)) ]))
user=> (keys statsds)(:column-names :rows)
73jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
DESTRUCTURINGDE MAP
74
user=> (keys statsds)(:column-names :rows)
(defn build-table [{:keys [rows]}] (html [:table (table-headers) (map table-row rows) ]))
74jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere75
45350 relevés"Elapsed time: 24940.557 msecs" => loader"Elapsed time: 24542.737 msecs" => 1er chart"Elapsed time: 3042.975 msecs" => 2eme chart"Elapsed time: 24317.2 msecs" => stats"Elapsed time: 122.479 msecs" => rapport
75jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
OPTIONS JVM
76
lein runException in thread "AWT-Shutdown" java.lang.OutOfMemoryError: Java heap space! at java.util.IdentityHashMap$Values.iterator(IdentityHashMap.java:1009)! at java.util.Collections$SynchronizedCollection.iterator(Collections.java:1573)
:main perfdemo.core :jvm-opts ["-Xmx1g"] )
project.clj
76jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
PERFORMANCE
77
Consolesurtout ne listez pas les données :o
Mémoiredonnées accumulées dans le dataset
IO Disquesi beaucoup de graphes à sauver sur disque
77jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere78
Faire un job MapReduce Hadoop
78jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
MAP REDUCE
79
79jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
input
output
:input-format source format
CLOJURE-HADOOP
80
:map-reader fn:map fn
:reduce fn
(defjob/defjob job :map my-map :map-reader wrap/int-string-map-reader :reduce my-reduce :input-format :text)
80jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere81
81jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
MAP
82
(defn my-map [key line] (cond (= key 0) [] :else ... ))
(defn my-map [key line] (cond (= key 0) [] :else [["all" t] [ lb t] [ shop t]] )))
(defn my-map [key line] (cond (= key 0) [] :else [["all" t] [(str "lb:" lb) t] [(str "shop:" shop) t]] )))
(defn csv-line-parser [line] (map #(.trim %) (first (csv/parse-csv line))))
;; require clojure-csv
(defn my-map [key line] (cond (= key 0) [] :else (let [ cells (csv-line-parser line) ] [["all" t] [(str "lb:" lb) t] [(str "shop:" shop) t]] )))
(defn csv-line-parser [line] (map #(.trim %) (first (csv/parse-csv line))))
;; require clojure-csv
(defn my-map [key line] (cond (= key 0) [] :else (let [ cells (csv-line-parser line) t (nth cells 0) ] [["all" t] [(str "lb:" lb) t] [(str "shop:" shop) t]] )))
(defn csv-line-parser [line] (map #(.trim %) (first (csv/parse-csv line))))
;; require clojure-csv
(defn my-map [key line] (cond (= key 0) [] :else (let [ cells (csv-line-parser line) t (nth cells 0) ] [["all" t] [(str "lb:" lb) t] [(str "shop:" shop) t]] )))
(defn csv-line-parser [line] (map #(.trim %) (first (csv/parse-csv line))))
;; require clojure-csv
(defn my-map [key line] (cond (= key 0) [] :else (let [ cells (csv-line-parser line) t (Long/parseLong (nth cells 0)) ] [["all" t] [(str "lb:" lb) t] [(str "shop:" shop) t]] )))
(defn csv-line-parser [line] (map #(.trim %) (first (csv/parse-csv line))))
;; require clojure-csv
(defn my-map [key line] (cond (= key 0) [] :else (let [ cells (csv-line-parser line) t (Long/parseLong (nth cells 0)) [lb, shop] (map #(nth cells %) [1,6])] [["all" t] [(str "lb:" lb) t] [(str "shop:" shop) t]] )))
82jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere83
83jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
REDUCE
84
(defn my-reduce [key values-fn] [[(str key ":count") (count values-fn)] [(str key ":mean") (stats/mean values-fn)]])
84jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
LEIN JAR
85
lein jar
et installer déployer dans hadoop
85jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
CASCALOG
86
Cascading + Datalog + Clojure
user=> (?<- (stdout) [?person ?age] (age ?person ?age) (< ?age 30))
Dites, vous aimez Prolog ?
86jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
LES ÉCOLES DE MAGIE
87
Paris Clojure User Group
http://dev.clojure.org/display/community/Clojure+User+Groups
Clojure sur Stackoverflow
4clojure.comlabrepl
87jeudi 13 septembre 2012
JUG Summer Camp 2012 Claude Falguiere
CLAUDE FALGUIERE
@cfalguiere
88
goo.gl/4mmJQ Merci
88jeudi 13 septembre 2012