gpt4 book ai didi

java - 比较 RDD 对象 - Apache Spark

转载 作者:行者123 更新时间:2023-12-01 08:50:12 25 4
gpt4 key购买 nike

我对 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;
}

现在我正在做的事情(我认为是错误的)是将 RDD 对象转换为列表:

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

并迭代该列表以检查是否存在覆盖并将结果保存到文件中,这需要很长时间,因为我没有使用 Spark。

 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 个基因名称的对象。

有没有办法在利用 Spark 的同时完成第二部分?因为这两个时间复杂度对于我目前拥有的数据量来说太大了。

最佳答案

是的,有,你必须使用RDD.cartesian函数来获取所有对,然后你基本上可以应用你编写的函数。

关于java - 比较 RDD 对象 - Apache Spark,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42443682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com