2015-11-02 70 views
3

我有一個s3上的大文件,我希望在下載時解碼和解析。我碰巧使用clojure Amazonica library,但任何圖書館都可以。從s3與Clojure/Java讀取流

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

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

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

但我如何讀取流? 我可以一次讀取一行嗎(解壓後的內容是JSON行)?

(如果有我的問題任何含糊之處,我只關心與讀取數據流,而不是gzip的解碼的任何部分)

回答

4

由於S3ObjectInputStream發生延長java.io.InputStream,您可以:

  1. 使用Clojure's reader函數可以得到BufferedReader
  2. 以任何方式從閱讀器讀取數據Clojure允許。
    • 使用line-seqBufferedReader獲得惰性序列。如果這對您的JSON有意義。它可能不會。
    • 使用懶惰的JSON解析器,如clj-lazy-json。這個特殊的人甚至可以處理一個裸流,所以步驟(1)可以安全地跳過。
7

如果是有幫助的人,這就是我想出了以下d邊樂於助人的響應。

(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))