Как Spark читает распределенные файлы - PullRequest
0 голосов
/ 14 мая 2018

Файл Fasta является многолинейным файлом. Это структурировано как

>ID_1
ACGTAGCATGC
>ID_2
AGCTAGTACATC

Итак, чтобы получить последовательности, мне нужно прочитать 1 строку из 2.

У меня есть несколько больших fasta-файлов (120Go на файл) для чтения. Я использую искру, чтобы прочитать эти файлы. В настоящее время я использую это, чтобы получить все последовательности в кадре данных:

val sequences = sc.textFile("path/to/directory").sliding(2, 2).map{case Array(id, seq) => seq}

Позволяет ли эта команда получить все последовательности, зная, что файлы распределены по кластеру искр?)

Ответы [ 2 ]

0 голосов
/ 07 августа 2018

Вы можете попробовать использовать FASTdoop (https://github.com/umbfer/fastdoop),, в котором реализованы программы чтения для файлов FASTA и FASTQ.

Это пример кода:

SparkSession spark = SparkSession.builder().master("local[*]").appName("FASTdoop Test Short").getOrCreate();    
SparkContext sc = spark.sparkContext();
JavaSparkContext jsc = new JavaSparkContext(sc);

Configuration inputConf = jsc.hadoopConfiguration();
inputConf.setInt("look_ahead_buffer_size", 4096);
String inputPath = "data/short.fasta";

JavaPairRDD<Text, Record> dSequences2 = jsc.newAPIHadoopFile(inputPath, 
        FASTAshortInputFileFormat.class, Text.class, Record.class, inputConf);

/* We drop the keys of the new RDD since they are not used */
JavaRDD<Record> dSequences = dSequences2.values();

for (Record sequence : dSequences.collect()) {
    System.out.println("ID: " + sequence.getKey());
    System.out.println("Sequence: " + sequence.getValue());
}

Более подробную информацию вы можете найти в файле README ветви spark_support.

0 голосов
/ 16 мая 2018

Так как каждая запись начинается с '>', вы можете попробовать изменить разделитель строк на '>' (по умолчанию '\ n') с этой строкой кода:

sc.hadoopConfiguration.set("textinputformat.record.delimiter",">")

Тогда это должно сделатьхитрость для вас:

sc.textFile("...")
  .filter(_ != "")
  .map(_.split("\n")(1))

Обратите внимание, что фильтр существует только для того, чтобы избавиться от первой пустой записи, которая генерируется, потому что файл начинается с '>'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...