Fasta文件是一个多行文件。它结构像
>ID_1
ACGTAGCATGC
>ID_2
AGCTAGTACATC
因此,要获得序列,我必须阅读2行中的1行。
我有多个大的fasta文件(每个文件120个)来读取。我用spark来读取这些文件。我目前使用它来获取数据帧上的所有序列:
val sequences = sc.textFile("path/to/directory").sliding(2, 2).map{case Array(id, seq) => seq}
此命令是否允许所有序列知道文件是否在spark群集上分发?)
答案 0 :(得分:1)
您可以尝试使用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());
}
您可以在“ spark_support”分支的README文件中找到更多详细信息。
答案 1 :(得分:0)
由于每条记录都以“&gt;”开头,因此您可以尝试将行分隔符更改为“&gt;” ('\ n'默认情况下)使用以下代码行:
sc.hadoopConfiguration.set("textinputformat.record.delimiter",">")
然后这应该为你做的伎俩:
sc.textFile("...")
.filter(_ != "")
.map(_.split("\n")(1))
请注意,过滤器仅用于删除由于文件以“&gt;”开头而生成的第一个空记录。