[HBase][Get] Строка, которую можно получить с помощью оболочки, но не через Java API

Я работаю над простым кодом, чтобы получить строку из HBase, которая не работает через HBase Java API, но ту же строку можно получить из оболочки.

Примеры идентификаторов строк:

F\x0A@z\x11\x0D\xB4\xD3\x05"S273320039#999279720
=\x0A@z\x1AI\xA4\xD8h\x12\x09754427158#999598625
F\x0A@z\x11\x0D\xA6@\x0C\x04\xDA490229991#999279958
M\x0A@z\x13\x092\x89a\x12\x111059947933#999223281
\x00\x0A@E\xFFn[\x18\x9F\xD4-1447846881#5241968320

Результат одного из RowId через оболочку:

hbase(main):003:0> get 'OSMNodes_z3_geometry_ingestionTimestamp_v6',"\x00\x0A@E\xFFn[\x18\x9F\xD4-1447846881#5241968320"
COLUMN                            CELL                                                                                            
 d:                               timestamp=1588532276719, value=\x03\x00\x06\x02\x00\x12\x00-\x005\x00=\x00R\x00Y\x01x\x00\x00\x0
                                  0\x00\x01\x08\x03\xC0V\xE9\x9AU\x81;\xD5\xBF\xF5\xA7FE^\xAE\xE2\x7F\xF8\x00\x00\x00\x00\x00\x00\
                                  x00\x00\x01q\x9Av\xA9\x00\x00\x00\x01q\x9B\x89Q\x801447846881#524196832\xB0geojso\xEE\xDE\x04{"g
                                  eometry":{"type":"Point","coordinates":[-91.6500448,-1.3533385]},"id":"5241968320","properties":
                                  {"tags":{},"changesetId":53988821,"version":1,"uid":1975220,"user":"jptolosa87","featureSource":
                                  "OSM","sourceTimestamp":"2017-11-22 00:01:26","ingestionTimestamp":"2020-04-21 02:00:00"}}

Java API-код

    public static void main(String[] args) {

        Configuration conf = HBaseConfiguration.create();
        conf.addResource(new Path("/etc/hbase/conf/hbase-default.xml"));
        conf.addResource(new Path("/etc/hbase/conf/hbase-site.xml"));

        try {
            HBaseAdmin.checkHBaseAvailable(conf);
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }

        Map<String, String> argVector = parseArgVector(args);

        final String fileName = argVector.get("fileName");
        final String hbaseTableName = argVector.get("hbaseTableName");
        final String rowId = argVector.get("rowId");
        final HTable table = getTable(hbaseTableName, conf);

        Result result = getRow(table, rowId);
        System.out.println(result);
        System.out.println(result.isEmpty());
        System.out.println(Bytes.toString(result.getRow()));
        System.out.println(Bytes.toString(result.getValue(Bytes.toBytes("d"), Bytes.toBytes(""))));
    }

    private static Result getRow(final HTable table, final String rowId) {
        try {
            Get get = new Get(Bytes.toBytes(rowId));
            System.out.println(Bytes.toString(get.getRow()));
            return table.get(get);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

person Aki008    schedule 22.05.2020    source источник
comment
Не уверен, имеет ли это какое-либо отношение к проблеме, но заметили ли вы, что ваша оболочка Get in HBase включает определенную метку времени, а ваша Java Get — нет? Может быть, в вашей последней строке есть маркер удаления или что-то в этом роде? Возможно, вы захотите добавить временную метку в Java Get, чтобы сделать ее эквивалентной.   -  person VS_FF    schedule 29.05.2020


Ответы (1)


Вы можете использовать этот код Java для чтения данных из таблицы HBase.

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import static org.apache.hadoop.hbase.util.Bytes.toBytes;

public class Main {

  public static void main(String[] args) {

    final String tableNameString = "OSMNodes_z3_geometry_ingestionTimestamp_v6";
    final TableName tableName = TableName.valueOf(tableNameString);

    Configuration conf = HBaseConfiguration.create();
    conf.addResource("hbase-site.xml");
    conf.addResource("core-site.xml");
    conf.addResource("HDFS-site.xml");

    try {
      Connection connection = ConnectionFactory.createConnection(conf);
      Table table = connection.getTable(tableName);
      Get get = new Get(toBytes("\\x00\\x0A@E\\xFFn[\\x18\\x9F\\xD4-1447846881#5241968320"));
      Result result = table.get(get);

      byte[] value = result.getValue(toBytes("d"), toBytes("d"));

      String valueString = Bytes.toString(value);

      System.out.println(valueString);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

Результат этого

log4j:WARN No appenders could be found for logger (org.apache.hadoop.util.Shell).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
\x03\x00\x06\x02\x00\x12\x00-\x005\x00=\x00R\x00Y\x01x\x00\x00\x00\x00\x01\x08\x03\xC0V\xE9\x9AU\x81;\xD5\xBF\xF5\xA7FE^\xAE\xE2\x7F\xF8\x00\x00\x00\x00\x00\x00\x00\x00\x01q\x9Av\xA9\x00\x00\x00\x01q\x9B\x89Q\x801447846881#524196832\xB0geojso\xEE\xDE\x04{"geometry":{"type":"Point","coordinates":[-91.6500448,-1.3533385]},"id":"5241968320","properties":{"tags":{},"changesetId":53988821,"version":1,"uid":1975220,"user":"jptolosa87","featureSource":"OSM","sourceTimestamp":"2017-11-22 00:01:26","ingestionTimestamp":"2020-04-21 02:00:00"}}

Process finished with exit code 0

Тест кода

Создание таблицы

hbase(main):017:0> create 'OSMNodes_z3_geometry_ingestionTimestamp_v6', 'd'
Created table OSMNodes_z3_geometry_ingestionTimestamp_v6
Took 2.2600 seconds                                                                                                             
=> Hbase::Table - OSMNodes_z3_geometry_ingestionTimestamp_v6

Вставить данные

hbase(main):018:0> put 'OSMNodes_z3_geometry_ingestionTimestamp_v6', '\x00\x0A@E\xFFn[\x18\x9F\xD4-1447846881#5241968320', 'd:d', '\x03\x00\x06\x02\x00\x12\x00-\x005\x00=\x00R\x00Y\x01x\x00\x00\x00\x00\x01\x08\x03\xC0V\xE9\x9AU\x81;\xD5\xBF\xF5\xA7FE^\xAE\xE2\x7F\xF8\x00\x00\x00\x00\x00\x00\x00\x00\x01q\x9Av\xA9\x00\x00\x00\x01q\x9B\x89Q\x801447846881#524196832\xB0geojso\xEE\xDE\x04{"geometry":{"type":"Point","coordinates":[-91.6500448,-1.3533385]},"id":"5241968320","properties":{"tags":{},"changesetId":53988821,"version":1,"uid":1975220,"user":"jptolosa87","featureSource":"OSM","sourceTimestamp":"2017-11-22 00:01:26","ingestionTimestamp":"2020-04-21 02:00:00"}}'
Took 0.0252 seconds           

Проверить наличие данных в таблице

hbase(main):019:0> get 'OSMNodes_z3_geometry_ingestionTimestamp_v6','\x00\x0A@E\xFFn[\x18\x9F\xD4-1447846881#5241968320'
COLUMN                            CELL                                                                                          
 d:d                              timestamp=1590516012791, value=\x5Cx03\x5Cx00\x5Cx06\x5Cx02\x5Cx00\x5Cx12\x5Cx00-\x5Cx005\x5Cx
                                  00=\x5Cx00R\x5Cx00Y\x5Cx01x\x5Cx00\x5Cx00\x5Cx00\x5Cx00\x5Cx01\x5Cx08\x5Cx03\x5CxC0V\x5CxE9\x5
                                  Cx9AU\x5Cx81;\x5CxD5\x5CxBF\x5CxF5\x5CxA7FE^\x5CxAE\x5CxE2\x5Cx7F\x5CxF8\x5Cx00\x5Cx00\x5Cx00\
                                  x5Cx00\x5Cx00\x5Cx00\x5Cx00\x5Cx00\x5Cx01q\x5Cx9Av\x5CxA9\x5Cx00\x5Cx00\x5Cx00\x5Cx01q\x5Cx9B\
                                  x5Cx89Q\x5Cx801447846881#524196832\x5CxB0geojso\x5CxEE\x5CxDE\x5Cx04{"geometry":{"type":"Point
                                  ","coordinates":[-91.6500448,-1.3533385]},"id":"5241968320","properties":{"tags":{},"changeset
                                  Id":53988821,"version":1,"uid":1975220,"user":"jptolosa87","featureSource":"OSM","sourceTimest
                                  amp":"2017-11-22 00:01:26","ingestionTimestamp":"2020-04-21 02:00:00"}}                       
1 row(s)
Took 0.0038 seconds

Наконец, применение приведенного выше кода (с использованием hbase-client версии 2.0.2) даст вам те же результаты, что и в оболочке HBase.

person mike    schedule 26.05.2020
comment
Результирующий ключ строки стал \x5Cx00\x5Cx0A@E\x5CxFFn[\x5Cx18\x5Cx9F\x5CxD4-1447846881#5241968320 при вставке в HBase. Во время вставки строка перед вставкой была закодирована в кодировке UTF-8. - person Aki008; 27.05.2020