我正在尝试将数据(大约760k行)从单列读取到一个(平展的)向量中。 clojure.java.jdbc/query
的结果是地图的序列,例如({:key "a"} {:key "b"} ...)
。提供选项:as-arrays? true
后,将返回[[:key] ["a"] ["b"] ...]
。为了使结果平坦,我还使用了选项:row-fn first
并得到了[:key "a" "b" ...]
。最后,我应用了rest
来摆脱:key
。
用向量包装和展开行似乎是很多不必要的工作。我对表现也不满意。有没有更快/更惯用的方式?我已经尝试过...
(jdbc/with-db-connection [con -db-spec-]
(with-open [^Statement stmt (.createStatement (:connection con))
^ResultSet res (.executeQuery stmt query)]
(let [ret (ArrayList.)]
(while (.next res)
(.add ret (.getString res 1)))
(into [] ret))))
...但是速度并不快,而且很丑。
编辑
更小巧的方法是通过换能器(请参见here):
(into []
(map :key)
(jdbc/reducible-query
connection
["SELECT key FROM tbl"]
{:raw? true}))
答案 0 :(得分:1)
您可以只使用:row-fn :key
。不知道您期望什么性能,但是在我的i5 PC上,检索760K记录花费了大约3秒钟(基于H2文件的数据库)
(time
(count
(jdbc/query db ["select top 760000 key from table1"] {:row-fn :key})))
;; => 760000
"Elapsed time: 3003.456295 msecs"