自定义 hadoop 键和值:如何编写 CompareTo() 方法

2023-12-10

我需要从映射器发出一个 2D 双精度数组作为键和值。 Stack Overflow 上发布了一些问题,但没有得到解答。

我正在给定的数据集中进行一些矩阵乘法,之后我需要发出A*Atrns这将是一个矩阵作为关键和Atrans*D这也将是一个矩阵作为值。那么如何从映射器发出这些矩阵。并且该值应该与键本身相对应。

ie key ----->  A*Atrans--------->after multiplication the result will be a 2D array which is declared as double (matrix) lets say the result be Matrix "Ekey"(double[][] Ekey)

value ------>  Atrans*D ---------> after multiplication the result will be Matrix "Eval" (double[][] Eval).

After that I need to emit these matrix to reducer for further calculations.

So in mapper: 
       context.write(Ekey,Eval);

Reducer:
      I need to do further calculations with these Ekey and Eval.

我写了我的课:

UPDATE

    public class MatrixWritable implements WritableComparable<MatrixWritable>{

/**
 * @param args
 */
    private double[][] value;
    private double[][] values;
    public MatrixWritable() {
    // TODO Auto-generated constructor stub

        setValue(new double[0][0]);
     }


    public MatrixWritable(double[][] value) {
    // TODO Auto-generated constructor stub

     this.value = value;
    }

    public void setValue(double[][] value) {

        this.value = value;

    }

    public double[][] getValue() {
        return values;
    }

    @Override
    public void write(DataOutput out) throws IOException {
    out.writeInt(value.length);                 // write values
     for (int i = 0; i < value.length; i++) {
       out.writeInt(value[i].length);
     }
     for (int i = 0; i < value.length; i++) {
       for (int j = 0; j < value[i].length; j++) {
           out.writeDouble(value[i][j]);
       }
     }

  }

    @Override
    public void readFields(DataInput in) throws IOException {

        value = new double[in.readInt()][];          
        for (int i = 0; i < value.length; i++) {
          value[i] = new double[in.readInt()];
        }
        values = new double[value.length][value[0].length];
      for(int i=0;i<value.length ; i++){
            for(int j= 0 ; j< value[0].length;j++){
                values[i][j] = in.readDouble();

            }
        }

  }



@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + Arrays.hashCode(value);
    return result;
}





/* (non-Javadoc)
 * @see java.lang.Object#equals(java.lang.Object)
 */
@Override
public boolean equals(Object obj) {
    if (this == obj) {
        return true;
    }
    if (obj == null) {
        return false;
    }
    if (!(obj instanceof MatrixWritable)) {
        return false;
    }
    MatrixWritable other = (MatrixWritable) obj;
    if (!Arrays.deepEquals(value, other.value)) {
        return false;
    }
    return true;
}


    @Override
    public int compareTo(MatrixWritable o) {
    // TODO Auto-generated method stub
    return 0;


    }

    public String toString() { String separator = "|";
        StringBuffer result = new StringBuffer();

        // iterate over the first dimension
        for (int i = 0; i < values.length; i++) {
            // iterate over the second dimension
            for(int j = 0; j < values[i].length; j++){
                result.append(values[i][j]);

                result.append(separator);
            }
            // remove the last separator
            result.setLength(result.length() - separator.length());
            // add a line break.
            result.append(",");
        }


        return result.toString();



  }

}

我能够从映射器发出一个值作为矩阵

context.write(...,new MatrixWritable(AAtrans));

如何从映射器发出矩阵 AtransD 作为键?

为此我需要编写compareto()方法,对吗?

该方法中应该包含什么?


首先,要实现自定义密钥,您必须实现WritableComparable。要实现自定义值,您必须实现Writable。在许多情况下,由于能够交换键和值很方便,因此大多数人将所有自定义类型编写为WritableComparable.

这是该部分的链接Hadoop: The Definitive Guide包括写一个WritableComparable. 编写自定义可写文件

写出数组的技巧是在读取端您需要知道要读取多少个元素。所以基本的模式是......

On write:
write the number of elements
write each element


On read:
read the number of elements (n)
create an array of the appropriate size
read 0 - (n-1) elements and populate array

Update

您应该在默认构造函数中将数组实例化为空,以防止稍后出现 NullPointerException。

您的实现的问题在于它假设每个内部数组的长度相同。如果确实如此,则无需多次计算列长度。如果为 false,则需要在写入该行的值之前写入每行的长度。

我会建议这样的事情:

 context.write(row); // as calculated above
 for (int i=0; i<row; i++){
     double[] rowVals = array[row];
     context.write(rowVals.length);
     for (int j=0; j<rowVals.length; j++)
         context.write(rowVals[j]);
 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义 hadoop 键和值:如何编写 CompareTo() 方法 的相关文章

随机推荐

  • UITextView:获取带有换行信息的文本

    是否可以获取 UITextView 中的文本及其换行信息 所以在这种情况下 我会收到类似 亲爱的 StackOverFlow n n你让我的 这样的文本 而不再有 n 我想在 and now I 之后得到一个换行符 如 UITextView
  • 如何在 ASP.net 中使用 Open XML 创建多级有序列表?

    我花了无数的时间试图理解 Open XML 中的有序列表 这是one许多参考文献 我发现这个简单文档创建器的示例非常有用here 另外 如果我可能有点抱怨 我必须说这是一个痛苦的学习曲线 创建编号属性并引用正确的编号属性abstractNu
  • 使用 Tensorflow 将学习率添加到 fit_generator 的历史对象

    我想检查我的优化器如何改变我的学习率 我使用的是张量流1 15 我用 fit generator 运行我的模型 hist model fit generator dat args onthefly 0 args batch args epo
  • 批处理变量名称中的冒号

    我有一个批处理脚本 它应该可以访问名为类似的变量env dev 所以它里面有一个冒号 这个变量是由第三方组件设置的 所以我对该命名没有影响 如何在批处理脚本中访问此变量的内容 我知道 是一个特殊字符 所以我可以逃避它吗 以下不起作用 ech
  • 检测 Fragment 内的 ViewPager 选项卡更改

    我有一个ViewPager具有多个片段 合而为一Fragment我播放音频 当我滑动到另一个片段时 我想停止音频播放 我如何检测另一个片段现在在ViewPager 我尝试过覆盖onStop and onHiddenChanged 没有成功
  • CodeIgniter - 如何从 URL 隐藏 index.php

    这就是我的 htaccess好像 这 htaccess正坐在 www scriptscodeigniter 的父目录system目录 其中还包含index php 我已启用mod rewrite在我的 Apache 2 2 x 中 这是在
  • 箭头点位于 gnuplot 上的文件上

    我知道通过这个命令我可以在 gnuplot 上创建一个箭头 set arrow from 0 0 to 1 1 但问题是我想创建一组箭头 位于文件 数据 x1 y1 x2 和 y2 不在数据文件中 我只是将它们拿出来以便更好地展示它们 x1
  • 根据字段值添加唯一约束

    对于下表 我想添加一个约束 即如果 IsBanned 标志设置为 true 则 BannedOn 字段不能留空 不能设置为 null 我怎样才能在 MySQL 中做到这一点 这是我的 CREATE 语法 CREATE TABLE IF NO
  • 禁用所有视图的触摸事件

    禁用所有视图的触摸事件的最佳方法是什么 这是一个禁用某些视图组的所有子视图的函数 Enables Disables all child views in a view group param viewGroup the view group
  • PHP 和 mySQL - ë 写为 à [重复]

    这个问题在这里已经有答案了 可能的重复 PHP 与 HTML 字符集编码混淆 我们遇到过正在转变的特殊角色 是什么原因造成的 我们该如何解决它 例如 becomes 谢谢 这是一个utf 8字符 你可以通过PHP中的utf8 encode
  • 对数组中的数组求和(JavaScript)[重复]

    这个问题在这里已经有答案了 我有一个由多个数组组成的数组 var array 1 2 1 1 3 4 现在我想获得一个数组 其中的元素是变量 array 中每个数组的总和 在此示例中 即 var sum 1 4 7 我怎样才能做到这一点 您
  • pi 计算中的分段错误(python)

    def pi times seq counter 0 for x in range times counter 2 seq append f 2 f f float counter float counter 1 float counter
  • ftp 到 azure 存储 blob(触发处理)

    我想从一个传输加密文件ftp server到 azure blob 存储容器 这是有问题的工作流程 CSVFtp 服务器上的加密文件 gt Trigger 例子 关于添加文件 gt 调用 一些处理解密的本地程序或api 然后创建输出csvb
  • 将数据填充到 VSTS 发布摘要选项卡

    我正在尝试创建一个版本 而不映射 TFS VSTS 中的现有构建 并在完成后在版本摘要中显示数据 纯文本步骤如下 发布 gt 清空发布定义 gt 添加构建任务 gt 创建发布 gt 部署 gt 在摘要部分查看数据 摘要数据可按预期查看 不会
  • CSS 样式类未在 Excel 中合并

    为什么 Excel 不合并这些样式 Excel IE jsFiddle 示例 http jsfiddle net 3RtJj HTML 源 table tr td no style td td class redFont red font
  • 如何在codeigniter活动记录中插入查询后获取最后一个插入id

    我有一个插入查询 活动记录样式 用于将表单字段插入 MySQL 表中 我想获取插入操作的最后一个自动递增 id 作为查询的返回值 但我遇到了一些问题 控制器内部 function add post post data array id gt
  • 如何在 Python 应用程序之上创建 GUI,以便它可以执行 GUI 或 CLI?

    我正在尝试用 python 编写一个应用程序来使用串行控制电机 这一切在 CLI 情况下都可以正常工作并且通常是稳定的 但我想知道在这个代码库之上添加 GUI 有多简单 我假设会有更多的代码 但是有没有一种简单的方法来检测像 GTK 这样的
  • 使用已知距离的其他两点查找三角形的第三点[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 上图中我有三点 x1 y1 x2 y2 x3 y3 我知道的价值观x1 y1 and x2 y2 我知道欧几里德距离 x1 y1 gt x3 y3 and x2 y2 gt x3 y
  • tkinter 中不可删除的文本

    这是一些代码 from Tkinter import class Main object def init self self console Text root relief groove cursor arrow spacing1 3
  • 自定义 hadoop 键和值:如何编写 CompareTo() 方法

    我需要从映射器发出一个 2D 双精度数组作为键和值 Stack Overflow 上发布了一些问题 但没有得到解答 我正在给定的数据集中进行一些矩阵乘法 之后我需要发出A Atrns这将是一个矩阵作为关键和Atrans D这也将是一个矩阵作