繁体   English   中英

使用Clojure / Java从s3读取流

[英]read stream from s3 with Clojure/Java

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

我可以轻松获得一个流:

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

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

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

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

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

由于S3ObjectInputStream碰巧扩展了java.io.InputStream ,您可以:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM