2017-04-27 77 views
1

我正在尝试从aws S3和R中提取文档。我成功地设法提取了1个文档并使用该文档创建了一个数据框。我希望能够提取多个位于eventstore/footballStats /的多个子文件夹内的文档。使用R从aws s3中提取多个json文档

CODE演示1个正在被拉出的文件。

install.packages("aws.s3", repos = c("cloudyr" = "http://cloudyr.github.io/drat")) # runs an update for aws S3 
library(aws.s3) 

# Set credentials for S3 #### 
Sys.setenv("AWS_ACCESS_KEY_ID" = "KEY","AWS_SECRET_ACCESS_KEY" = "AccessKey") 


# Extracts 1 document raw vector representation of an S3 documents #### 
DataVector <-get_object("s3://eventstore/footballStats/2017-04-22/13/01/doc1.json") 

我已经然后试图下面的代码来拉从文件夹和子文件夹的所有文件,但收到一个错误。

DataVector <-get_object("s3://eventstore/footballStats/2017-04-22/*") 

ERROR : 

chr "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error> 
<Code>NoSuchKey</Code><Message>The specified key does not exist.</Message><K"| __truncated__ 

是否有替代的r软件包,我应该使用?或者函数get_object()仅适用于1个文档,我应该使用aws.s3库中的另一个函数?

+0

的文件是不是在'cloudyr'项目非常清楚,所以最好的选择可能是在同一时间获得一个对象。如果对象太多,请从桶中获取对象列表('cloudyr'提到它),然后使用'paste'在列表中迭代以为每个桶创建一个URL,然后为get_object创建一个URL。 – Drj

+0

您无法将glob或模式传递给'get_object()'。它只会返回一个对象,因此@Drj建议使用'get_bucket()'列出所有对象,然后迭代对象键,将每个对象传递给'get_object()'。 – Thomas

+0

谢谢@Drj。我能解决这个问题。 – Mark

回答

1

基于从DRJ和托马斯的提示,我能够解决这个..

### Displays Buckets in s3#### 
bucketlist() 

### Builds a dataframe of the files in a bucket### 
dfBucket <- get_bucket_df('eventstore', 'footballStats/2017-04-22/') 

# creates path based on data in bucket 
path <- dfBucket$Key 

### Extracts all data into values #### 
s3Data <- NULL 
for (lineN in path) { 
    url <- paste('s3://eventstore/',lineN, sep= "") 
    s3Vector <- get_object(url) 
    s3Value <- rawToChar(s3Vector) 
    s3Data <- c(s3Data, s3Value) 
} 

要创建从数据使用tidyjson和dplyr一个数据帧。请参阅有关此解释良好的文档的链接。

https://cran.r-project.org/web/packages/tidyjson/vignettes/introduction-to-tidyjson.html