s3.保存一个json文件到aws s3。

问题描述 投票:0回答:1

我想把一个正确格式的json文件保存到aws s3。

我可以用e.g.将一个普通的数据框架保存到s3。

library(tidyverse)
library(aws.s3)
s3save(mtcars, bucket = "s3://ourco-emr/", object = "tables/adhoc.db/mtcars/mtcars")

但我需要把mtcars变成json格式。特别是ndjson。

我可以用e.g.创建一个正确格式的json文件。

predictions_file <- file("mtcars.json")
jsonlite::stream_out(mtcars), predictions_file)

这样就能把文件保存到我的目录下,叫做mtcars.json。

然而,使用aws.s3函数,我发现 s3save()我需要发送一个内存中的对象,而不是一个文件。

试过了。

predictions_file <- file("mtcars.json")
s3write_using(mtcars, 
              FUN = jsonlite::stream_out,
              con = predictions_file,
              "s3://ourco-emr/", 
              object = "tables/adhoc.db/mtcars/mtcars")

Gives:

错误在if(verbose) message("opening", is(con), "output connection.") : 参数不能解释为逻辑

我尝试了同样的代码块,但省去了con=predictions_file这一行,这只是给出了。

Argument con must be a connection.

如果函数 jsonlite::stream_out() 创建了一个正确格式的json文件,我如何将该文件写入s3?

编辑:想要的json输出是这样的。

{"mpg":21,"cyl":6,"disp":160,"hp":110,"drat":3,"wt":2,"qsec":16,"vs":0,"am":1,"gear":4,"carb":4,"year":"2020","month":"03","day":"05"}
{"mpg":21,"cyl":6,"disp":160,"hp":110,"drat":3,"wt":2,"qsec":17,"vs":0,"am":1,"gear":4,"carb":4,"year":"2020","month":"03","day":"05"}
{"mpg":22,"cyl":4,"disp":108,"hp":93,"drat":35,"wt":2,"qsec":18,"vs":1,"am":1,"gear":4,"carb":1,"year":"2020","month":"03","day":"05"}
{"mpg":21,"cyl":6,"disp":258,"hp":110,"drat":8,"wt":3,"qsec":19,"vs":1,"am":0,"gear":3,"carb":1,"year":"2020","month":"03","day":"05"}
{"mpg":18,"cyl":8,"disp":360,"hp":175,"drat":3,"wt":3,"qsec":17,"vs":0,"am":0,"gear":3,"carb":2,"year":"2020","month":"03","day":"05"}

当我尝试用readchar:

mtcars_string <- readChar("mtcars.json", 1e6)
s3save(mtcars_string, bucket = "s3://ourco-emr/", object = "tables/adhoc.db/mtcars/2020/03/06/mtcars")

如果我下载并打开生成的json文件,它看起来是这样的。

5244 5833 0a58 0a00 0000 0300 0306 0000
0305 0000 0000 0555 5446 2d38 0000 0402
0000 0001 0004 0009 0000 000d 6d74 6361
7273 5f73 7472 696e 6700 0000 1000 0000
0100 0400 0900 0012 347b 226d 7067 223a
3231 2c22 6379 6c22 3a36 2c22 6469 7370

所以看起来就像一个tsb被发送到了aws s3上 而不是json上

r amazon-s3 jsonlite
1个回答
1
投票

我有同样的问题。我需要编写并上传JSON行(ndjson)到S3,据我所知,只有 stream_out() 来自 jsonlite-package写JSON行。

stream_out() 只把连接对象作为目标。s3write_using()然而,它会写入一个临时文件 tmp 并将该文件的路径作为一个字符串传递给 FUN. stream_out() 然后抛出错误。

参数con必须是一个连接。

一个暂定的修复方法是修改 s3write_using() 传递连接到 FUN 而不是文件路径字符串。

  1. trace(s3write_using, edit=TRUE) - 打开一个编辑器

  2. 将第5行改为: value <- FUN(x, tmp, ...)

    改成这样 value <- FUN(x, file(tmp), ...)

然后你就可以用以下方法上传数据 stream_out():

s3write_using(x = data, 
              FUN = stream_out,
              bucket = 'mybucket',
              object = 'my/object.json',
              opts = list(acl = "private", multipart = FALSE, verbose = T, show_progress = T))

编辑将在整个会话中保持不变,或者直到你做了 untrace(s3write_using).

也许应该在他们的 cloudyraws.s3 GitHub 中提交一个请求,因为这是一个常见的使用案例。

© www.soinside.com 2019 - 2024. All rights reserved.