2016-08-16 3 views
1

Ich verarbeite Ströme in Riemann und alle Felder sind Strings. Allerdings möchte ich einige numerische Vergleiche für einige Felder durchführen. Deshalb habe ich versucht, sie in float zu konvertieren.Konvertiere einen String in einem Float mit Riemann in clojure

Sagen wir, mein Strom, wie das ist:

#riemann.codec.Event{:host "myHost", :service nil, :state nil, :description "my description", :pred_score "0.156"} 

Ich habe versucht, die riemann.conf Datei mit so etwas zu ändern:

(streams 
(with :new_field (read-string :pred_score)) 
prn) 

Allerdings habe ich einige Fehler, und ich fühle mich wie das ist nicht der richtige Weg, dies zu tun. Ich habe kürzlich einige Sachen gelesen, die mich denken lassen, dass ich smap oder adjust verwenden sollte, aber ich bin nicht sicher.

Ich bin übrigens clojure absolut nicht vertraut. (Tatsächlich habe ich es bei Riemann entdeckt).

Haben Sie eine Idee, wie Sie das Problem angehen können?

Vielen Dank im Voraus,

Robin.

Antwort

0

Ich weiß nicht, über den Riemann Teil, aber in einfachen clojure können Sie entweder Java Interop oder the Tupelo library verwenden. Mit Java-Interop, dann würden Sie tun:

> (def x {:host "myHost", :service nil, :state nil, :description "my description", :pred_score "0.156"}) 
> (Double/parseDouble (:pred_score x)) 
0.156 

Die ‚tupelo.parse‘ Namespace wickelt diese in einem normalen clojure-Funktion und bietet die Möglichkeit, einen Standardwert angeben, im Falle einer fehlerhaften Wert zurückzukehren (statt eine Ausnahme zu werfen):

> (require '[tupelo.parse :as parse]) 
> (parse/parse-double (:pred_score x)) 
0.156 
> (parse/parse-double "123.4x6" :default 0) 
0 
+0

Sie sollten [einen Haftungsausschluss hinzufügen, die Sie der Autor der Bibliothek sind] (https://meta.stackoverflow.com/questions/298734/is-it-acceptable-to -promote-meine-eigene-Bibliothek-als-Teil-einer-realen-Antwort # comment217878_298743). –

+0

Vielen Dank für Ihre Antwort, aber ich noch einen Fehler: 'clojure.lang.Compiler $ CompilerException: java.lang.NullPointerException' Hier ist meine Syntax: ' (Strom (if (> (Doppel/parseDouble (: pred_score event)) 0.5) prn) ) ' Habe ich etwas falsch gemacht mit der Clojure-Syntax, oder ist es ein Fehler aufgrund einer Riemann-Konfiguration, die ich vermasselt habe? –

+0

Könnte es so einfach sein wie 'Ereignis' undefiniert (d. H.' Nil')? Sie müssen den gesamten Code für uns einfügen, um ein Problem wie dieses zu sehen. Geben Sie einfach "(println" event = "event)" ein –

Verwandte Themen