2011-12-24 4 views
3

데시 시온 트리를 나타내는 데 사용할 HDFS에 이진 트리를 써야합니다. 하지만 그렇게하기 위해서 먼저 트리 노드가 될 BinaryTreeNode 클래스를 생성해야합니다. 이 내 클래스 속성은 다음과 같습니다hadoop에서 이진 트리 쓰기 FS

private String name; 
private String attribute; 
private String attType; 
private String condition; 
private String lines; 
private BinaryTreeNode leftChild; 
private BinaryTreeNode rightChild; 

그래서 지금 내가 읽고 이러한 노드를 작성에 대한 쓰기 및 readFields의 방법을 구현해야합니다. 이것들은 내가 한 일이다 :

public void write(DataOutput d) throws IOException 
{ 
    d.writeUTF(name); 
    d.writeUTF(attribute); 
    d.writeUTF(attType); 
    d.writeUTF(condition); 
    d.writeUTF(lines); 
    //SOMETHIN FOR LEFT AND RIGHT CHILD 
} 

public void readFields(DataInput di) throws IOException 
{ 
    name=di.readUTF(); 
    attribute=di.readUTF(); 
    attType=di.readUTF(); 
    condition=di.readUTF(); 
    lines=di.readUTF(); 
    //SOMETHIN FOR LEFT AND RIGHT CHILD 
} 

BinaryTreeNode read(DataInput in) throws IOException 
{ 
    BinaryTreeNode ob = new BinaryTreeNode(); 
    ob.readFields(in); 
    return ob; 
} 

나는 2 개의 자식 노드를 쓰고 읽는 방법을 생각한다. 트리는 재귀 적으로 빌드 될 것이고 모든 노드는 0-2자를 가질 것임에 유의하십시오. 그래서 나중의 목적은 BinaryTreeNode 루트 속성을 가질 BinaryTree 클래스를 갖는 것입니다. 감사합니다

+0

그래서 이진 탐색 트리입니다. 한 번의 탐색에서 2 진 탐색 트리를 구성 할 수 없습니다. 메인 트리를 구성 할 수 있도록 '순서대로, 순서대로 또는 순서대로, 선주문'트래버스를 작성해야합니다. –

+0

내가 필요한 것은 내 나무를 저장하고로드하는 방법입니다. 어떻게 든 내 루트를 개체로 저장하고로드하는 방법을 찾으면 내 목표는 fullfiled됩니다. 글쎄 이진 검색 트리가 아닙니다. 기계 학습에 사용되는 desicion tree입니다. 바이너리 분할을하고 있기 때문에 이진 트리입니다. 그 모델을 저장하고로드해야합니다. – jojoba

답변

1

좋아, 해결책을 찾았습니다. 나는 그것이 충분히 효율적인지는 모르지만 작동한다. 여기 내가 한 일이있다. 이 내 클래스 정의에 있습니다

public void write(DataOutput d) throws IOException 
    { 
     d.writeUTF(name); 
     d.writeUTF(attribute); 
     d.writeUTF(attType); 
     d.writeUTF(condition); 
     d.writeUTF(lines); 
     ObjectWritable left=new ObjectWritable(BinaryTreeNode.class,leftChild); 
     left.write(d); 
     ObjectWritable right=new ObjectWritable(BinaryTreeNode.class,rightChild); 
     right.write(d); 
    } 

    public void readFields(DataInput di) throws IOException 
    { 
     name=di.readUTF(); 
     attribute=di.readUTF(); 
     attType=di.readUTF(); 
     condition=di.readUTF(); 
     lines=di.readUTF(); 
     leftChild=(BinaryTreeNode) ObjectWritable.readObject(di, new Configuration()); 
     rightChild=(BinaryTreeNode) ObjectWritable.readObject(di, new Configuration()); 

    } 

을 그리고 이것은 내가 그들을 사용하는 방법이다 : 쓰기 위해

:

 BinaryTreeNode bla=new BinaryTreeNode(); 
     //set the attributes 
     ObjectWritable obj=new ObjectWritable(BinaryTreeNode.class,bla); 
     obj.write(dos); 

읽기가 :

 BinaryTreeNode bla=new BinaryTreeNode(); 
     bla= (BinaryTreeNode) ObjectWritable.readObject(in, conf); 

이 잘 작동합니다. 이제는 내 루트를 저장하여 의사 결정 트리를 만들고 저장할 수 있습니다. : D

+0

당신의 readFields & Write 함수 구현이 적절하게 보이지 않습니다. 대신 name = di.readUTF(); 당신은 name.readUTF (di) –

+0

을 사용해야합니다. 당신의 솔루션은 정말로 작동합니까 ?? –

2

나는 내가 필요로 저장하고 내 나무를로드하는 방법입니다 HDFS

에 이진 트리를 작성해야합니다.

HDFS와 함께하는 이유는 무엇입니까? HDFS는 모든 유형의 데이터/파일을 저장할 수있는 분산 파일 시스템입니다. 그래프를 효과적으로 저장하고 검색하기위한 코드를 많이 작성했습니다.

OrientDBNeo4j과 같은 그래프 지향 데이터베이스에서 그래프를 저장하고 검색 할 수 있습니다.

또한 Apache Giraph, Apache HamaGoldenOrb과 같은 오픈 소스 프레임 워크가 있습니다. Java 프로그램에서 상호 작용할 바인딩이있을 수도 있습니다.

+0

저는이 http://www.bayardo.org/ps/vldb2009.pdf를 구현하려고합니다. MFile이라고하는 현재 건설 된 desicion 트리를 각 매퍼에게 보내야합니다. 네가 나를 보낸 사람들을 살펴 보겠다. 감사. 나는 그것이 훨씬 더 간단하다고 생각하지만. 나는 어제 2 마리의 아이를 가진 내 나무의 뿌리를 구하기 위해 관리했습니다. 나는 아직도 그걸로 일하고있다. 나는 쉽고 빠르게 뭔가를 원하지 않습니다. 감사 : D – jojoba