在hadoop FS中写一个二叉树

时间:2011-12-24 22:01:55

标签: java hadoop binary-tree writable

我需要写一个二进制树到HDFS,我将用它来表示一个desicion树。但为了做到这一点,我首先需要创建一个BinaryTreeNode类,它将是树节点。这些是我的类属性:

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

所以现在我需要实现write和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个子节点。所以我后来的目的是让BinaryTree类具有属性BinaryTreeNode root。感谢

2 个答案:

答案 0 :(得分:2)

  

我需要写一个二进制树到HDFS

     

我只需要一种保存和加载树的方法。

使用HDFS的原因是什么? HDFS是一种分布式文件系统,可以在其上存储任何类型的数据/文件。您已经编写了大量代码来大规模地存储和检索图形。

您可以在面向图形的数据库中存储和检索图形,例如OrientDBNeo4j

此外,还有开源框架,如Apache GiraphApache HamaGoldenOrb。可能还存在从Java程序进行交互的绑定。

答案 1 :(得分: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