2015-05-03 21 views
5

Tôi muốn có một đường ống thanh lịch để chuyển đổi đầu vào văn bản thành đầu ra json. Dòng chảy sẽ giống như sau:Đường ống xử lý tập tin (chức năng) trong Scala

(input file)    // concatenated htmls and url 
Collection[String]  // unit: line 
Collection[String,String] // unit: url, html doc 
Collection[MyObj]   // unit: parsed MyObj 
(output file)    // json representation of parsed objects 

Hiện tại tôi làm điều này với lồng cho vòng, nhưng tôi muốn viết kiểu này theo cách chức năng hơn. Có cách nào tiêu chuẩn để thực hiện việc này hay các thư viện điển hình mà tôi nên xem? Lưu ý: dữ liệu là khá lớn, vì vậy tôi không thể có nó hoàn toàn trong bộ nhớ.

+0

Tôi đoán 'Bộ sưu tập [MyObj]' sẽ được in dưới dạng mảng JSON? Bạn có giải pháp hiện tại cho điều đó không? – stholzm

+0

@stholzm có chính xác. Tôi có một chức năng để tính toán JSON của một 'MyObj' duy nhất, nhưng sau đó tôi bọc nó trong' [,] 'trong các vòng lặp. – mitchus

+0

có vẻ như bạn đang tìm kiếm một thư viện đại diện cho nội dung của một mảng JSON là 'Iterable' hoặc lười biếng khác. Mọi thứ khác đều nghe được, nhưng tôi không có ý tưởng ở đó. Ai đó có một ý tưởng? – stholzm

Trả lời

2

Có lẽ bạn có thể sử dụng luồng Scalaz. Thư viện cung cấp tính sáng tác, tính biểu cảm, an toàn tài nguyên và tốc độ xử lý IO. Ngoài ra, nó sử dụng bộ nhớ tức thì sẽ rất hữu ích để xử lý dữ liệu lớn. Dưới đây là github cho rằng:

https://github.com/scalaz/scalaz-stream

Youtube nói về nó:

https://www.youtube.com/watch?v=GSZhUZT7Fyc

https://www.youtube.com/watch?v=nCxBEUyIBt0

+0

Điều đó trông rất thú vị ... Cũng được liên kết từ trang đó: [Máy ​​móc] (https://github.com/ekmett/machines/) – mitchus

+0

"Phân tích cú pháp trực tuyến" vẫn đang trên lộ trình. Bạn không chắc chắn cách thực hiện phần JSON của câu hỏi. – stholzm

+0

Tôi sử dụng thư viện này trong dự án của mình, có vẻ tuyệt vời khi xử lý dữ liệu lớn và xử lý song song. Tôi không nghĩ rằng rất khó để tích hợp nó với thư viện JSON như argonaut (http://argonaut.io/). Nó có thể tuần tự hóa và deserialize nó một cách tiện dụng. –

0

Tôi thường sử dụng cho comprehensions cho các nhiệm vụ như vậy với scala-cánh tay cho tài nguyên quản lý (AutoClosable, Closeable v.v.).

Nhiều hướng dẫn sử dụng scala hướng dẫn sử dụng for { s <- Source.fromFile(...).getLines() } nhưng đó là cách tốt để tài nguyên bị rò rỉ, vì Nguồn sẽ không được đóng tự động.

Với scala-cánh tay nó trông giống như:

import resource._ 

for { source <- managed(Source.fromFile(...)) 
     target <- managed(Files.newBufferedWriter(...)) } { 
    for { rawLine <- source.getLines 
     line = rawLine.trim() if !rawLine.startsWith("#") 
     (url, html) <- parseString(line) 
     json <- toJsonOpt(html) } { 
    // actual action 
    target.write(s"$url\t$json\n") 
    } 
} 

Nếu bạn cần đường ống phức tạp hơn, bạn có thể sử dụng scalaz dòng, Strom, spark hoặc một số thư viện khác để xác định DAG đường ống thực tế và bắt đầu thực hiện.

Các vấn đề liên quan