使用Clojure / Java从s3读取流

时间:2015-11-02 07:14:49

标签: java amazon-s3 clojure

我在s3上有一个大文件,我希望在下载时解码和解析。我碰巧使用了clojure Amazonica library,但任何图书馆都会这样做。

我可以很容易地获得一个流:

(def stream (-> (get-object "some-s3-bucket" "some-object-key") :input-stream))

; returns: #<S3ObjectInputStream com.amazonaws.services.s3.model.S3ObjectInputStream

但是如何阅读流? 我可以一次读一行(解压缩的内容是JSON行)吗?

(如果我的问题存在任何歧义,我只关心流的读取,而不是gzip解码的任何部分)

2 个答案:

答案 0 :(得分:8)

如果它对任何人都有帮助,那么这就是我在D-Side的有用回应之后提出的。

(ns some-project.get-s3-stream
    (:require [aws.sdk.s3 :as s3])
    (:require [clojure.java.io :as io])
    (:use [amazonica.aws.s3])
    (:import [java.util.zip GZIPInputStream]))

(def bucket "some-s3-bucket")
(def object-key "some-object-key")

(def seq-of-json-lines
  (->
   (get-object bucket object-key)
   :object-content
   (java.util.zip.GZIPInputStream.)
   io/reader
   line-seq))

答案 1 :(得分:4)

由于S3ObjectInputStream恰好延伸java.io.InputStream,您可以:

  1. 使用Clojure's reader功能获取BufferedReader
  2. 以Clojure允许的任何方式从阅读器中读取数据。
    • 使用line-seqBufferedReader获取一系列懒惰的行。如果这对你的JSON有意义。它可能没有。
    • 使用惰性JSON解析器,例如clj-lazy-json。这个特殊的人甚至可以处理裸流,因此可以安全地跳过步骤(1)。