【问题标题】:Write a binary tree in hadoop FS在hadoop FS中写一棵二叉树
【发布时间】:2012-01-27 11:10:38
【问题描述】:

我需要将一个二叉树写入 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 根。谢谢

【问题讨论】:

  • 所以它是一个二叉搜索树。您不能从一次遍历中构建二叉搜索树。需要同时写in-order, post-order或者in-order, pre-order遍历,这样就可以构造主树了。
  • 我只需要一种方法来保存和加载我的树。如果我以某种方式找到一种方法来保存我的根目录并将其加载为对象,那么我的目标将实现。好吧,它不是二叉搜索树。它是用于机器学习的决策树。由于我正在进行二进制拆分,因此它是一棵二叉树。我需要保存并加载该模型。

标签: java hadoop binary-tree writable


【解决方案1】:

我需要将二叉树写入 HDFS

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

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

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

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

【讨论】:

  • 我正在尝试实现这个 bayardo.org/ps/vldb2009.pdf 。我需要向每个映射器发送当前构建的决策树,称为 MFile。我会看看你寄给我的那些。谢谢。虽然我认为它要简单得多。我昨天设法保存了我的树的根,它有两个孩子。我仍在使用它。我想要一些简单的东西,而不是快速有效的东西。谢谢:D
【解决方案2】:

好的,我找到了解决方案。我不知道它是否足够有效,但它有效。这就是我所做的。这些在我的类定义中:

    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

【讨论】:

  • 您的 readFields & Write 函数实现看起来不正确。而不是 name=di.readUTF();你必须使用 name.readUTF(di)
猜你喜欢
  • 2015-12-20
  • 2014-09-24
  • 1970-01-01
  • 2017-01-28
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多