У меня есть огромный файл JSON.gz (gzipped, около 700 ГБ), который разделен. Я применил lapply
и jsonlite
для импорта данных, но мне нужен эффективный способ для этого.
После преобразования json в список, а затем преобразования некоторых из них в dataFrame, структура выглядит так: json to dataFrame Image
> head(df)
userName transactionId drKey requestTime networkVersion
1 BOj4o8hTNqu6xxljJIbX-ADj1la-6x3-AYGG9h4fpWk 0bccac808f984382aeb5a463d2186009 0bccac808f984382aeb5a463d2186009-10000 2019-07-17T03:34:13.064 190710
2 BOj4o8hTNqu6xxljJIbX-ADj1la-6x3-AYGG9h4fpWk 0bccac808f984382aeb5a463d2186009 0bccac808f984382aeb5a463d2186009-70000 2019-07-17T03:34:13.065 190710
3 BOj4o8hTNqu6xxljJIbX-ADj1la-6x3-AYGG9h4fpWk 0bccac808f984382aeb5a463d2186009 0bccac808f984382aeb5a463d2186009-20000 2019-07-17T03:34:13.064 190710
4 BOj4o8hTNqu6xxljJIbX-ADj1la-6x3-AYGG9h4fpWk 0bccac808f984382aeb5a463d2186009 0bccac808f984382aeb5a463d2186009-50100 2019-07-17T03:34:13.066 190710
5 BOj4o8hTNqu6xxljJIbX-ADj1la-6x3-AYGG9h4fpWk 0bccac808f984382aeb5a463d2186009 0bccac808f984382aeb5a463d2186009-50000 2019-07-17T03:34:13.065 190710
6 BOj4o8hTNqu6xxljJIbX-ADj1la-6x3-AYGG9h4fpWk 0bccac808f984382aeb5a463d2186009 0bccac808f984382aeb5a463d2186009-40000 2019-07-17T03:34:13.063 190710
routePointCount routeDistance routeTravelTime routeLinkCount
1 1378 77192 5943 563
2 1115 87629 4074 272
3 1115 87629 4074 272
4 1250 81756 5493 467
5 1115 87629 4075 272
6 1115 87629 4075 272
Единственные данные, которые мне нужны, - это столбцы в первом и втором столбцах. Кроме того, требуется только «уникальная» строка, основанная на значении второго столбца.
В настоящее время файл json читается, преобразуется в list и dataFrame, а данные извлекаются с помощью функции «duplicated (or unique)» из второго столбца. Однако этот метод потребляет слишком много памяти. Слишком много ненужных данных нужно прочитать.
Есть ли способ импортировать в R, анализируя только ту информацию, которую я хочу получить из файла json?
Вот мой текущий код в R:
jsonToList<-lapply(readLines("E:/data/rslog/rslog-2019-07-17-part-00.json.gz"), fromJSON)
df<-data.frame()
sample_size<-100 # this is just for small size data test
for (j in 1:sample_size){
for (i in 1:9){ # actually I need just two columns
df[j,i]<-jsonToList[[j]][i]
}
}
df_need<-df[-which(duplicated(df$transactionId,fromLast = TRUE)),]