如何在 Hadoop 中使用自定义类型

Posted

技术标签:

【中文标题】如何在 Hadoop 中使用自定义类型【英文标题】:How to use custom types in Hadoop 【发布时间】:2020-01-05 03:11:26 【问题描述】:

我正在尝试制作经典字数统计程序的修改版本,其中目标输出是输入文档的名称及其包含的唯一单词数。

为了实现这一点,我计划使用自定义数据类型作为键,其中数据类型包含输入文件的名称和单词。即:DataStruct = [文件名,单词]。

我的计划是分两次执行此操作,第一次我将输入文件映射到 (DataStruct, 1) 键值对,然后将其减少到 -> (DataStruct, count)。 我设想每一行的格式如下:

..
file1 word 4
file2 word 6
..

然后,我将在 map 阶段产生 (filename, 1) 对,reducer 产生所需的 (filename, count) 输出。

我的第一个(也是次要的)问题是,这是否是解决这个问题的合理方法,网上没有很多可供参考的 hadoop 材料,所以我很感激在这个领域有经验的人可以提供的任何指点给我。

我遇到的主要问题以及我遇到的问题是在我的第一阶段的输出中。我希望在我的代码中实现以下类后,我会得到所需的file word count 输出,但事实并非如此。

    public static class DataStruct implements WritableComparable<DataStruct> 
        private Text word;
        private Text filename;

        public DataStruct(Text w, Text fn) 
            word = w;
            filename = fn;
        

        public DataStruct() 
            word = new Text();
            filename = new Text();
        

        public void set(Text w, Text fn) 
            word = w;
            filename = fn;
        

        public Text getFilename() 
            return filename;
        

        public Text getWord() 
            return word;
        

        @Override
        public int compareTo(DataStruct d) 
            if(word.compareTo(d.word) == 0) 
                return filename.compareTo(d.filename);
            
            else return word.compareTo(d.word);
        

        @Override
        public boolean equals(Object o) 
            if(o instanceof DataStruct) 
                DataStruct other = (DataStruct) o;
                return word.equals(other.word) && filename.equals(other.filename);
            
            else return false;
        

        @Override
        public void readFields(DataInput in) throws IOException 
            word.readFields(in);
            filename.readFields(in);
        

        @Override
        public void write(DataOutput out) throws IOException 
            word.write(out);
            filename.write(out);
        

        @Override
        public int hashCode() 
            String combine = word.toString()+filename.toString();
            return combine.hashCode();
        

    

我的输出看起来像这样:

..
UniqueWordsDocument$DataStruct@a3cd2dd1 1
UniqueWordsDocument$DataStruct@1f6943cc 1
..

我在网上找不到任何可以解释这一点的东西。我发现@之后的值是数据的哈希码,但如果没有输出中的文件名和单词,我不知道如何进行。如果有人能解释这里发生了什么和/或如何解决这个问题,我将非常感激。

感谢您的帮助。

【问题讨论】:

也许这个问题在某种程度上也能帮助到你,***.com/questions/26208454/… 【参考方案1】:

您需要覆盖 DataStruct 类中的 public String toString() 方法。

就目前而言,Java 不知道如何显示您的 DataStruct 对象,因此只打印对对象本身的引用。

你可能想要这样的东西:

@Override
public String toString() 
    return word.toString() + "-" + filename.toString();

【讨论】:

以上是关于如何在 Hadoop 中使用自定义类型的主要内容,如果未能解决你的问题,请参考以下文章

在python中为Hadoop Map Reduce创建自定义可写键/值类型?

Hadoop 学习自定义数据类型

自定义Writable类型

Hadoop学习之路MapReduce自定义排序

hadoop 学习自定义排序

大数据技术|Hadoop 3.0: YARN Resource自定义资源配置说明