Java中具有Avro的MapReduce:字符串,CharSequence和Utf8数据类型

Mar*_*ina 2 java hadoop mapreduce avro

我是用Avro编写Hadoop MapReduce的初学者,并且不清楚将String,CharSequence或Utf8对传递给map / reduce方法之间的区别是什么?

如果字符串仅仅是“ hello world”之类的东西怎么办?

例如,这是一个简单的映射方法,在这种情况下,使用CharSequence作为输出键类型:

public void map(Pair<CharSequence, Integer> datum, AvroCollector<Pair<CharSequence, Integer>> collector, Reporter reporter) throws IOException {
            Integer number_one = new Integer(1);
            String output_key = "hello world";
            collector.collect(new Pair<CharSequence, Integer>(output_key, one));
        }
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏!

Tho*_*lut 5

CharSequence是“捆绑”的界面大多数基于实施方式中的人物的StringBuilderStringBufferCharBufferString和在阿夫罗Utf8

String是不可变的,这意味着您无法修改内部数据-您所做的每次修改都会导致String创建新的对象。

Utf8另一方面,将允许您修改其内部缓冲区(“可变”),与使用String实例相比,这将产生更少的垃圾。

因此,可以说using CharSequence是最灵活的解决方案,因为它允许您传递比专业实现更多的Strings表示形式,您可以根据自己的需要从可用的实现中进行选择。

  • 与这个问题有关的警告词。您可能要坚持使用CharSequence的一种特定实现,例如String,而不是使用常规接口。不同CharSequence实现的哈希码不一定匹配,这可能会引起问题。参见例如http://stackoverflow.com/questions/19728853/apache-avro-map-uses-charsequence-as-key (4认同)