java - 如何在 Hadoop 中对自定义可写类型进行排序

我有一个自定义类型,其中包含 Hadoop native 类型的字段(例如 TextIntWritable ),并且需要在随机/排序阶段将其用作键并根据需要进行排序。有类似的问题,如 this one和 this one ,但它们是关于使用 native 类型的。如何与自定义类型达到同样的效果,需要满足哪些要求?

最佳答案

实现这一结果存在细微差别,有些是显而易见的,有些则不是。我将尝试用几个简短的点来解释它们:

  • 首先自定义类型必须实现WritableComparable而不仅仅是Writable当然,定义 compareTo()方法。
  • 来自 Hadoop: The Definitive Guide 的非常重要的说明:

    All Writable implementations must have a default constructor so that the MapReduce framework can instantiate them, then populate their fields by calling readFields().



    也许最容易出错的部分是默认构造函数应该实例化该字段(如果它们未初始化),因为它们 不得为空。
  • 如果您对默认排序不满意,这一点是关于创建自定义比较器。在这种情况下,您需要创建一个扩展 WritableComparator 的新类。并覆盖其compare()方法。在此之后,您有两种方法可以使用此比较器而不是默认的方法:你设置这个类在 Job 的 setSortComparatorClass 的帮助下使用方法:
    job.setSortComparatorClass(YourComparator.class)
    

    在您的自定义类型的静态 block 中注册它:
    static {  
        WritableComparator.define(CustomType.class, new YourComparator());
    }
    

    The static block registers the raw comparator so that whenever MapReduce sees the class, it knows to use the raw comparator as its default comparator.


  • Here是具有静态嵌套比较器的此类的示例。

    https://stackoverflow.com/questions/55133030/

    相关文章:

    apache-spark - Spark的示例在客户端模式下引发FileNotFoundExcept

    nginx - 多个网站在Docker容器中运行,如何实现?

    docker - docker 容器可以连接到 SRIOV 虚拟功能吗?

    hadoop - 在实际运行oozie工作流之前如何检测错误?

    ubuntu - docker登录错误: no such host

    sql - 配置单元确定日期重叠的记录

    hadoop - 如何将新记录更新到临时表中的主表

    python - Fedora 22 : ERROR: No module named '_rpmb

    hadoop - 为什么 hive 中的CTAS查询没有得到预期的结果?

    amazon-web-services - 需要有关数据管道创建的设计输入