可以說我想在clojure中打印hbase表掃描的輸出。Clojure和HBase:通過掃描迭代懶惰
(defmulti scan (fn [table & args] (map class args)))
(defmethod scan [java.lang.String java.lang.String] [table start-key end-key]
(let [scan (Scan. (Bytes/toBytes start-key) (Bytes/toBytes end-key))]
(let [scanner (.getScanner table scan)]
(doseq [result scanner]
(prn
(Bytes/toString (.getRow result))
(get-to-map result))))))
其中get-to-map將結果變成地圖。它可以像這樣運行:
(hbase.table/scan table "key000001" "key999999")
但是如果我想讓用戶對掃描結果做些什麼呢?我可以允許他們傳遞一個函數作爲回調應用於每個結果。但我的問題是:我該怎麼回報,如果我希望用戶能夠在每個結果
(Bytes/toString (.getRow result))
(get-to-map result)
和不能保留以前的結果,因爲可能與懶惰的一個簡單的執行力度發生懶洋洋地迭代-seq。
感謝。我現在正在返回一個函數,調用結果掃描器上的下一個函數,直到它耗盡爲止 '#(let [result(.next result-scanner)] (if(not = result nil) [(Bytes/toString(.getRow result))(get-to-map result)] nil))' 接下來我在理解的工作就是如何簡潔地調用這個函數,直到它返回nil,然後發生。 '(let [cursor(hbase.table/scan table「k1」「r2」)] ...)' – 2013-05-02 01:01:02
btw。感謝您的java.lang.String - >字符串擡頭 – 2013-05-02 01:02:25
當然。我編輯了答案,添加了兩個如何將預處理結果傳遞給客戶端的例子。在Clojure中,將一個集合 - 通常是一個懶惰的序列 - 返回給客戶端通常比使用Java迭代器或任何工作集合更爲常見。另一種解決方案是返回一個減速器;您需要使用Clojure 1.5,但是您可以使用'r/map'進行預處理,讓客戶端自己創建'r/map'(或其他),並且不用擔心中間分配問題。代碼的一般感覺保持非常相似。 – 2013-05-02 01:09:52