Вопрос
Я хотел бы подтвердить следующее:
Если фильтр отфильтровал строку, сопоставитель не должен вызываться вместе с ней.
Цель
Попытка добавить meta:uuid
столбец к строкам, которые еще не имеют такого столбца.
Как ни странно, все, кажется, работает, несмотря на журналы предполагают обратное.
Код
Фильтр:
new SingleColumnValueFilter(
Bytes.toBytes( "meta" ),
Bytes.toBytes( "uuid" ),
CompareFilter.CompareOp.NOT_EQUAL,
new NullComparator()
);
Карта:
@Override
public void map( ImmutableBytesWritable row, Result columns, Context context ) throws IOException, InterruptedException {
Put put = new Put( row.get() );
String uuid = UUID.randomUUID().toString();
put.add( META_COLUMNFAMILY, UUID_QUALIFIER, uuid.getBytes() );
System.out.println( uuid.toString() );
context.write( row, put );
}
Поведение
Первый запуск
Он добавляет meta:uuid
столбец ко всем строкам.
Второй запуск
Мы все еще получаем System.out.println( uuid.toString() )
выходные данные с новыми UUID-это говорит о том, что был вызван mapper.
Но UUID (или метка времени) не изменяются в HBASE.
Хорошо, как говорят документы:
Поэтому мне пришлось добавить:
(Что касается того, почему UUID не изменился — это, кажется, связано с какой-то проблемой с HBase, которая была исправлена после перезапуска.)