2017-02-24 14 views
0

私はApacheのスパーク技術にかなり興味があり、ファイルから引き出しているデータを分析しようとするといくつか問題があります。RDDオブジェクトの比較 - Apache Spark

私は遺伝子情報の大きなリストを持っており、私はその情報をRDDに引き出しています。

JavaRDD<Gene> inputfile = sc.textFile(logFile).map(
     new Function<String, Gene>() { 
      @Override 
      public Gene call(String line) throws Exception { 
       String[] values = line.split("\t"); 
       Gene gen = null; 

       //We are only interested in genes; 
       if(values.length > 2 && values[2].equalsIgnoreCase("gene") && !line.contains("#")){ 
        String[] infoGene = values[8].split(";"); 

        String geneId = StringUtils.substringBetween(infoGene[0], "\""); 
        String geneType = StringUtils.substringBetween(infoGene[2], "\""); 
        String geneName = StringUtils.substringBetween(infoGene[4], "\""); 
        gen = new Gene(geneName,values[3],values[4]); 

        return gen; 
       } 
       return gen; 
      } 
     } 
    ).filter(new Function<Gene, Boolean>() { 
     @Override 
     public Boolean call(Gene gene) throws Exception { 
      if(gene == null) 
       return false; 
      else 
       return true; 
     } 
    }); 

遺伝子クラス:

public class Gene implements Serializable{ 
String firstBp; 
String lastBp; 
String name; 

public Gene(String name, String firstBp, String lastBp) { 
    this.name = name; 
    this.firstBp = firstBp; 
    this.lastBp = lastBp; 
} 

public String getFirstBp() { 
    return firstBp; 
} 

public String getLastBp() { 
    return lastBp; 
} 

public String getName() { 
    return name; 
} 

public String toString(){ 
    return name + " " + firstBp + " " + lastBp; 
}} 

問題はここから始まり、私は2つの遺伝子オーバーレイ場合は分析する必要があり、そのために私はこの単純なユーティリティ関数作った:

public static Boolean isOverlay(Gene gene1, Gene gene2){ 
    int gene1First = Integer.parseInt(gene1.getFirstBp()); 
    int gene1Last = Integer.parseInt(gene1.getLastBp()); 
    int gene2First = Integer.parseInt(gene2.getFirstBp()); 
    int gene2Last = Integer.parseInt(gene2.getLastBp()); 

    if(gene2First >= gene1First && gene2First <= gene1Last) // FirstBp - Gene2 inside 
     return true; 
    else if (gene2Last >= gene1First && gene2Last <= gene1Last) // LastBP - Gene2 inside 
     return true; 
    else if (gene1First >= gene2First && gene1First <= gene2Last) // FirstBp - Gene1 inside 
     return true; 
    else if (gene1Last >= gene2First && gene1Last <= gene2Last) // LastBP - Gene1 inside 
     return true; 
    else 
     return false; 
} 

今私がやっていることは間違っていると思います:

List<Gene> genesList = inputfile.collect(); 

このリストを繰り返して、オーバーレイがあるかどうかを確認し、スパークを使用していないため、年齢を重ねているファイルを保存します。

List<OverlayPair> overlayPairList= new ArrayList<OverlayPair>(); 
List<String> visitedGenes = new ArrayList<String>(); 

for (Gene gene1 : genesList){ 

     for (Gene gene2 : genesList) { 
      if (gene1.getName().equalsIgnoreCase(gene2.getName()) || visitedGenes.contains(gene2.getName())) { 
       continue; 
      } 

      if (isOverlay(gene1, gene2)) 
       overlayPairList.add(new OverlayPair(gene1.getName(), gene2.getName())); 

     } 
     visitedGenes.add(gene1.getName()); 
    } 

    JavaRDD<OverlayPair> overlayFile = sc.parallelize(overlayPairList); 

    //Export the results to the file 
    String outputDirectory = "/Users/joaoalmeida/Desktop/Dissertacao/sol/data/mitocondrias/feup-pp/project/data/output/overlays"; 
    overlayFile.coalesce(1).saveAsTextFile(outputDirectory); 

オーバーレイペアは基本的に2つの遺伝子名を持つオブジェクトです。

スパークを利用しながらこの2番目の部分をやってもらえますか?それらの2のための時間の複雑さは私が現在持っているデータの量のために大きいです。

答えて

1

はい、すべてのペアを取得するにはRDD.cartesian関数を使用する必要があります。次に、書いた関数を基本的に適用することができます。

関連する問題