这是一个 [n]ewline [d]elimited [json] (ndjson) 文件,它是为 ndjson 包量身定制的。所述包比jsonlite::stream_in() 快得多,并产生“完全平坦”的数据框。后一部分(“完全平坦”)并不是人们真正需要的,因为它可以构建一个非常宽的结构(在你的例子中,1,012 列,因为它扩展了所有嵌套组件)但是你得到无需自行取消嵌套即可快速满足您的需求。
str() 甚至 glimpse() 的输出太大,无法在此处显示,但这就是您使用它的方式。
注意我重命名了你的文件,因为.json.gz 通常是 ndjson 的存储方式(我的包可以处理 gzip 的 json 文件):
library(ndjson)
library(tidyverse)
twdf <- tbl_df(ndjson::stream_in("~/Desktop/pashwar-test.json.gz"))
## dim(twdf)
## [1] 75008 1012
话虽如此……
我也建议使用 Apache Drill,因为您有很多这些文件,而且它们相对较大。 Drill 会让你(最终)将这些转换为镶木地板并显着加快速度,并且有一个包可以与 Drill 接口 (sergeant):
library(sergeant)
library(tidyverse)
db <- src_drill("dbserver")
twdf <- tbl(db, "dfs.json.`pashwar-test.json.gz`")
glimpse(twdf)
## Observations: 25
## Variables: 28
## $ extended_entities <chr> "{\"media\":[]}", "{\"media\":[]}", "{\"m...
## $ quoted_status <chr> "{\"entities\":{\"hashtags\":[],\"symbols...
## $ in_reply_to_status_id_str <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
## $ in_reply_to_status_id <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
## $ created_at <chr> "Tue Dec 16 10:13:47 +0000 2014", "Tue De...
## $ in_reply_to_user_id_str <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
## $ source <chr> "<a href=\"http://twitter.com/download/an...
## $ retweeted_status <chr> "{\"created_at\":\"Tue Dec 16 09:28:17 +0...
## $ quoted_status_id <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
## $ retweet_count <int> 220, 109, 9, 103, 0, 398, 0, 11, 472, 88,...
## $ retweeted <chr> "false", "false", "false", "false", "fals...
## $ geo <chr> "{\"coordinates\":[]}", "{\"coordinates\"...
## $ is_quote_status <chr> "false", "false", "false", "false", "fals...
## $ in_reply_to_screen_name <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
## $ id_str <dbl> 5.447975e+17, 5.447975e+17, 5.447975e+17,...
## $ in_reply_to_user_id <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
## $ favorite_count <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
## $ id <dbl> 5.447975e+17, 5.447975e+17, 5.447975e+17,...
## $ text <chr> "RT @afneil: Heart-breaking beyond words:...
## $ place <chr> "{\"bounding_box\":{\"coordinates\":[]},\...
## $ lang <chr> "en", "en", "en", "en", "en", "en", "en",...
## $ favorited <chr> "false", "false", "false", "false", "fals...
## $ possibly_sensitive <chr> NA, "false", NA, "false", NA, "false", NA...
## $ coordinates <chr> "{\"coordinates\":[]}", "{\"coordinates\"...
## $ truncated <chr> "false", "false", "false", "false", "fals...
## $ entities <chr> "{\"user_mentions\":[{\"screen_name\":\"a...
## $ quoted_status_id_str <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
## $ user <chr> "{\"id\":25968369,\"id_str\":\"25968369\"...
但是
您已经设法创建了真正不一致的 JSON。并非所有具有嵌套内容的字段都以这种方式始终如一地表示,并且 Drill 的新手会发现制作防弹的 SQL 来帮助他们在所有场景中取消嵌套这些数据有些挑战。
如果您只需要“已经平坦”的数据,请尝试使用 Drill。
如果您需要嵌套数据并且不想与jsonlite::stream_in() 的取消嵌套或钻头取消嵌套作斗争,那么我建议您使用第一个示例中所述的ndjson,然后切出位您确实需要更易于管理、更整洁的数据框。