Я нашел два решения этой проблемы:
Custom HbaseTemplate, который расширяет HbaseAccessor
и реализует HbaseOperations
Кажется, лучший способ - создать пользовательский класс, который расширяет HbaseAccessor
и реализует HbaseOperations
так же, как и исходный HbaseTemplate
, но с использованием нового API (ie. Table
вместо HTableInterface
et c.)
Один из примеров его реализации можно найти в проекте easyhbase .
Внедрение Connection
вместо HbaseTemplate
Другое решение - внедрить Connection
в репозиторий и выполнить всю тяжелую работу там:
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.stream.Collectors;
import java.stream.StreamSupport;
@Component
public class ItemRepositoryImpl implements ItemRepository {
@Autowired
private Connection connection;
@Override
public List<Item> findAll() throws IOException {
Scan scan = new Scan();
scan.addColumn(CF, CQ);
try (Table table = connection.getTable(TableName.valueOf(TABLE_NAME))) {
return StreamSupport
.stream(table.getScanner(scan).spliterator, false)
.map(...)
.collect(Collectors.toList());
}
}
}
Connection
@Bean можно настроить следующим образом:
@Configuration
public class HbaseConfiguration {
@Bean
public Connection() throws IOException {
org.apache.hadoop.conf.Configuration conf = HBaseConfiguration.create();
// configuration setup
return ConnectionFactory.createConnection(conf);
}
}