使用Clojure/Java从s3读取流

使用Clojure/Java从s3读取流,java,amazon-s3,clojure,Java,Amazon S3,Clojure,我有一个s3上的大文件,我希望在下载时对其进行解码和解析。我碰巧正在使用clojure,但任何库都可以 我可以很容易地得到一条流: (def stream (-> (get-object "some-s3-bucket" "some-object-key") :input-stream)) ; returns: #<S3ObjectInputStream com.amazonaws.services.s3.model.S3ObjectInputStream (定义流(->(获取对

我有一个s3上的大文件,我希望在下载时对其进行解码和解析。我碰巧正在使用clojure,但任何库都可以

我可以很容易地得到一条流:

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

; returns: #<S3ObjectInputStream com.amazonaws.services.s3.model.S3ObjectInputStream
(定义流(->(获取对象“some-s3-bucket”“some-object key”):输入流)
; 返回:#由于恰好扩展了
java.io.InputStream
,因此您可以:

  • 使用函数在其上获取一个
    BufferedReader
  • 以Clojure允许的任何方式从读卡器读取数据。
    • 用于从
      BufferedReader
      获取延迟行序列。如果这对您的JSON有意义的话。可能不会
    • 使用惰性JSON解析器,例如。这个特殊的程序甚至可以处理一个裸流,因此可以安全地跳过步骤(1)

  • 如果这对任何人都有帮助的话,这就是我在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))