Разница между текстом и строкой в ​​Hadoop

В чем разница между org.apache.hadoop.io.Text и java.lang.String в структуре Hadoop?

Почему они не могли использовать String вместо того, чтобы вводить новый класс Text?

Я исследовал разницу и выяснил, что она связана с форматом кодирования; однако я пока этого не понимаю.

Может кто-нибудь объяснить различия (с примерами, если применимо)?

Ответ 1

Двоичное представление объекта Text является целым числом переменной длины, содержащим количество байтов в представлении UTF-8 строки, за которым следует UTF-8 байты сами.

Текст заменяет класс UTF8, который устарел потому что он не поддерживал строки, кодировка которых превышала 32 767 байт, и потому он использовал Javas, модифицированный UTF-8.

Кроме того, Text использует стандартный UTF-8, что делает его потенциально более удобным для взаимодействия с другими инструментами, которые понимают UTF-8.

Ниже приведены некоторые из кратких различий, связанных с его функционированием в отношении String:

Indexing: Из-за того, что он использует стандартный UTF-8, есть некоторые отличия между текстом и классом Java String. Индексирование для класса Text относится к позиции в кодированной последовательности байтов, а не в символе Unicode в строке, или в Java char блок кода (как и для String).

Например, charAt() возвращает значение int, представляющее кодовую точку Unicode, в отличие от Вариант строки, который возвращает char.

Итерация: Итерация по символам Юникода в тексте осложняется использованием байта смещения для индексирования, поскольку вы не можете просто увеличивать индекс.

Mutable: Другое отличие от String заключается в том, что Text является изменяемым (как и все Writable-реализации в Hadoop, кроме NullWritable, который является singleton). Вы можете повторно использовать Text, вызвав один из методов set() на нем.

Возвращение к строке:

Текст не имеет столь же богатого API для управления строками, как java.lang.String, поэтому во многих случаях вам нужно преобразовать объект Text в строку. Это делается обычным способом, используя метод toString():

Подробнее читайте окончательное руководство.