HBase / MR — карта вызвана несмотря на фильтр, но без вывода

Вопрос

Я хотел бы подтвердить следующее:

Если фильтр отфильтровал строку, сопоставитель не должен вызываться вместе с ней.

Цель

Попытка добавить 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.

1 ответ

  1. Хорошо, как говорят документы:

    Также необходимо указать семейство и квалификатор. Будет проверяться только значение этого столбца. При использовании этого фильтра на CellScanner с указанными входными данными, столбец, который будет проверяться, также должен быть добавлен в качестве входного (в противном случае фильтр будет считать столбец отсутствующим).

    Поэтому мне пришлось добавить:

    scan.addColumn( Bytes.toBytes( "meta" ), Bytes.toBytes( "uuid" ) );
    

    (Что касается того, почему UUID не изменился — это, кажется, связано с какой-то проблемой с HBase, которая была исправлена после перезапуска.)