大型json文件的示例

时间:2017-10-18 10:52:06

标签: json r dplyr

我有一个大型JSON文件(8 GB,800万个案例),但我只需要一小部分样本。简单stream_in不起作用,因为文件太大。

为了解决这个问题,我尝试了以下代码:

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

问题是,在300万页后,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 个答案:

答案 0 :(得分:2)

如果您的文件每行有一个案例,您可以使用LaF包非常有效地执行此操作:

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

然后,您可能必须将行转换为所需的格式,但此解决方案允许从大文件中读取而无需将所有内容读入内存。

修改 将结果行转换为data.frame

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

只要JSON对象中的字段只包含单个值(即不嵌套),这就应该有效。