使用Clojure/Java从s3读取流

Dav*_*vid 4 java clojure amazon-s3

我在s3上有一个大文件,我希望在下载时解码和解析.我碰巧使用了clojure Amazonica库,但任何库都可以.

我可以轻松获得一个流:

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

; returns: #<S3ObjectInputStream com.amazonaws.services.s3.model.S3ObjectInputStream
Run Code Online (Sandbox Code Playgroud)

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

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

Dav*_*vid 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))
Run Code Online (Sandbox Code Playgroud)


D-s*_*ide 5

由于S3ObjectInputStream恰好扩展java.io.InputStream,您可以:

  1. 使用Clojure 的reader函数来获取BufferedReader它。
  2. 以 Clojure 允许的任何方式从读取器读取数据。
    • 用于line-seqBufferedReader. 如果这对您的 JSON 有意义。可能不会。
    • 使用惰性 JSON 解析器,例如clj-lazy-json. 这个特殊的甚至可以处理一个裸流,因此可以安全地跳过步骤 (1)。