Clojure jdbc - запрос сплющенного результата на один столбец - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь прочитать данные (около 760 тыс. Строк) из одного столбца в один (плоский) вектор.Результатом 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))))

... но это не намного быстрее, и это ужасно.


РЕДАКТИРОВАТЬ

Хороший способ сделать это с помощью преобразователей (см. здесь ):

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

1 Ответ

0 голосов
/ 14 февраля 2019

Вы можете просто использовать :row-fn :key.Не уверен, какую производительность вы ожидаете, но на моем компьютере i5 получение 760K записей заняло ~ 3 секунды (база данных на основе файла H2)

(time
 (count
  (jdbc/query db ["select top 760000 key from table1"] {:row-fn :key})))
;; => 760000

"Elapsed time: 3003.456295 msecs"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...