如何通过http请求将S3中的多个gzip文件读取到单个RDD中



我必须下载存储在S3上的许多gzip文件,如下所示:

crawl-data/CC-MAIN-2018-43/segments/1539583508988.18/robotstxt/CC-MAIN-20181015080248-20181015101748-00000.warc.gz
crawl-data/CC-MAIN-2018-43/segments/1539583508988.18/robotstxt/CC-MAIN-20181015080248-20181015101748-00001.warc.gz

要下载它们,必须添加前缀https://commoncrawl.s3.amazonaws.com/

我必须下载并解压缩文件,然后将内容组装为单个RDD。

类似的东西:

JavaRDD<String> text = 
sc.textFile("https://commoncrawl.s3.amazonaws.com/crawl-data/CC-MAIN-2018-43/segments/1539583508988.18/robotstxt/CC-MAIN-20181015080248-20181015101748-00000.warc.gz");

我想用火花做这个代码:

for (String key : keys) {
object = s3.getObject(new GetObjectRequest(bucketName, key));
gzipStream = new GZIPInputStream(object.getObjectContent());
decoder = new InputStreamReader(gzipStream);
buffered = new BufferedReader(decoder);
sitemaps = new ArrayList<>();
String line = buffered.readLine();
while (line != null) {
if (line.matches("Sitemap:.*")) {
sitemaps.add(line);
}
line = buffered.readLine();
}

要从S3中读取内容,可以执行以下操作:

sc.textFiles("s3n://path/to/dir")

如果dir包含您的gzip文件,它们将被压缩并合并为一个RDD。如果您的文件不是直接位于目录的根目录,如下所示:

/root
/a
f1.gz
f2.gz
/b
f3.gz

甚至这个:

/root
f3.gz
/a
f1.gz
f2.gz

那么您应该使用像这样的通配符sc.textFiles("s3n://path/to/dir/*"),spark将递归地查找dir及其子目录中的文件。

不过要小心。通配符会起作用,但在生产中,您可能会在S3上遇到后期问题,并且可能需要使用AmazonS3Client来检索路径。

最新更新