2017-10-18 50 views
3

我有一個大的JSON文件(8 GB,800萬個案例),但我只需要它的一個小樣本。簡單的stream_in不起作用,因爲文件太大。大JSON文件的樣本

爲了解決這個問題,我想下面的代碼:

books <- list("Books_5.json") 
books <- map(books, ~ stream_in(file(.x)) %>% sample_n(385)) 
books <- as.data.frame(books) 

的問題是,經過3萬頁[R停止在文件中讀取,因爲該文件是如此之大。任何想法如何獲得該文件的385個案例的樣本?

較小文件的示例。變量是相同的。

Variables: 9 
$ reviewerID  <chr> "AF50PEUSO9MSV", "A1L0TVAJ1TYE06", "A64NRL5OSR3KB", ... 
$ asin   <chr> "B0000A1G05", "B009SQQF9C", "B005HRT88G", "B00D5T3QK... 
$ reviewerName <chr> "Matthew J. Hodgkins", "TCG", "Me", "J. Lee", "A. Bu... 
$ helpful  <list> [<1, 1>, <0, 1>, <1, 1>, <0, 0>, <0, 0>, <0, 0>, <0... 
$ reviewText  <chr> "This is the lens that I always keep on my camera by... 
$ overall  <dbl> 5, 5, 5, 5, 5, 5, 5, 4, 5, 2, 5, 4, 5, 4, 5, 5, 3, 4... 
$ summary  <chr> "Great lens!", "I love them! What else can I say", "... 
$ unixReviewTime <int> 1370736000, 1404518400, 1387411200, 1385769600, 1379... 
$ reviewTime  <chr> "06 9, 2013", "07 5, 2014", "12 19, 2013", "11 30, 2... 
+1

你能提供一些示例數據嗎? –

回答

2

如果你的文件每行一個情況下,你可以使用LaF包非常有效地做到這一點:

library(LaF) 
random_lines <- sample_lines(filename = "Books_5.json", 
    n = 385) 

你可能會再有線路改造成你需要的格式,但這種解決方案允許從大文件讀取而不需要將所有內容讀入內存。

編輯: 所得線轉化成data.frame

do.call("rbind",lapply(random_lines, fromJSON)) 

這應該只要在JSON-對象中的字段僅包含單個值(即不嵌套的)工作。

+0

感謝您的回答,但我不知道如何將結果字符串再次轉換回原始數據框。 – Hadsga

+0

如果不知道結果字符串是怎麼樣的,說不清楚...你試過'jsonlite :: fromJSON()'嗎? –

+0

該文件看起來像這樣: 'chr [1:385]「{\」reviewerID \「:\」A29BC531E6553J \「,\」asin \「:\」0812510011 \「,\」reviewerName \「:\」Richard Rivera \「,\」helpful \「| __truncated__ ...' – Hadsga