首页 > 解决方案 > Clojure jdbc - 查询单列展平结果

问题描述

我正在尝试将数据(cca 760k 行)从单列读取到一个(展平的)向量中。结果clojure.java.jdbc/query是地图的序列,例如({:key "a"} {:key "b"} ...)。提供选项:as-arrays? true[[:key] ["a"] ["b"] ...]返回。为了使结果变平,我还使用了 option: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))))

...但它并没有快多少,而且很丑。


编辑

更好的方法是通过传感器(见这里):

(into []
      (map :key)
      (jdbc/reducible-query
       connection
       ["SELECT key FROM tbl"]
       {:raw? true}))

标签: jdbcclojure

解决方案


你可以只使用: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"

推荐阅读