Как прочитать несколько сжатых файлов из S3 в один RDD с запросом http? - PullRequest
0 голосов
/ 08 ноября 2018

Мне нужно скачать много сжатых файлов, хранящихся на S3, например:

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");

Я хочу сделать этот код с помощью spark:

    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();
        }

1 Ответ

0 голосов
/ 08 ноября 2018

Чтобы прочитать что-то из 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, для которого вы получаете пути.

...