Используя java API, я хочу вставить данные в свою базу данных HBase. Мне нужно создать класс размещения перед вставкой, например:

Put p = new Put(Bytes.toBytes("row1"));

Моя программа берет данные от пользователя и помещает их в базу данных, но проблема в том, что для вставки требуется имя строки (здесь row1), но я не знаю, как сгенерировать ее однозначно и автоматически, потому что для каждой строки она должна быть разной, а если нет перезаписать данные.

Вот мой код:

String fName, lName, number ;
    Scanner in = new Scanner (System.in) ;
    System.out.println("Wainting for taking new phone number info ...\n");
    System.out.println("Please Enter first name : ");
    fName = in.nextLine() ;
    System.out.println("Please Enter last name : ");
    lName = in.nextLine() ;
    System.out.println("Please Enter number : ");
    number = in.nextLine() ;


    Configuration config = HBaseConfiguration.create();
    HTable hTable = new HTable(config, "phoneList");
    Put p = new Put(Bytes.toBytes("row1"));
    p.add(Bytes.toBytes("personal"), Bytes.toBytes("firstName")
            ,Bytes.toBytes(fName));
    p.add(Bytes.toBytes("personal"), Bytes.toBytes("lastName")
            ,Bytes.toBytes(lName));
    p.add(Bytes.toBytes("phone"), Bytes.toBytes("number")
            ,Bytes.toBytes(number));
    hTable.put(p);
    hTable.close();

    in.close();
1
user5810793 20 Фев 2016 в 19:55

2 ответа

Лучший ответ

Это зависит от того, какой должна быть клавиша строки. В HBase, поскольку ключ строки является единственным индексом, и когда вы пытаетесь использовать тот же ключ строки и пытаетесь вставить данные в столбец, который уже присутствует, он попытается переопределить данные. Вы можете проверить это с помощью связанной с ним метки времени. Если вы укажете новый столбец, данные не будут заменены.

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

Scan bigtableScan = new Scan();
List<Result> getResults = null;
try(ResultScanner bigTableResults = bigtableTable.getScanner(bigtableScan)){
    getResults = new ArrayList<>();
    for(Result bigTableResult = bigTableResults.next(); (bigTableResult != null); 
       bigTableResult = bigTableResults.next()) {
         getResults.add(bigTableResult);
    }
}

Перейдите к последней строке в списке результатов. Чтобы получить строку из результата, все, что вы можете сделать:

for(Result hbaseResult : getResult){
     String rowKey = Bytes.toString(hbaseResult.getRow());
}

Когда у вас будет последняя строка, вы можете применить свою собственную логику, чтобы получить новую строку и вставить строку в таблицу.

0
Chetan Somani 26 Фев 2016 в 17:44

rowkey не является именем строки. Фактически это ключ строки для каждого столбца. Если вы хотите вставить или изменить строку в HBase, необходимо предоставить ключ строки.

Согласно документации HBase, увеличение / создание ключей строк проблематично в хранилищах данных, подобных BigTable. и это не рекомендуется.

Вы можете проверить, существует ли rowkey, следующим образом:

Get get = new Get(rowkey);
Result result = htable.get(get);
if (!result.isEmpty()) {
throw new Exception("Row with this key already exists.");
}
0
Mobin Ranjbar 21 Фев 2016 в 08:12