3

我需要将二叉树写入 HDFS,我将用它来表示决策树。但为了做到这一点,我首先需要创建一个 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 根。谢谢

4

2 回答 2

2

我需要将二叉树写入 HDFS

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

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

您可以从OrientDBNeo4j等面向图形的数据库中存储和检索图形。

此外,还有Apache GiraphApache HamaGoldenOrb等开源框架。也可能存在与 Java 程序交互的绑定。

于 2011-12-25T07:21:54.450 回答
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

于 2011-12-27T17:25:36.873 回答