2012-01-12 10 views
7

cuando se trabaja con la API de Java HBase, tengo una línea del código de la siguiente manera:Java (HBase) API: ¿Cómo sabe el tipo de datos de un valor almacenado en bytes

byte[] value = scanner.next().getValue(Bytes.toBytes(family), Bytes.toBytes(qualifier)); 

asume que no lo hago saber si es un tipo Int o String para este valor, que debo usar entre Byte.toInt(value) y Byte.toString(value) para imprimir el valor correctamente?

Esto no es realmente una pregunta de HBase/Hadoop, sino más bien una de Java, pero busqué en Google y no puedo encontrar la manera de obtenerlo. ¿Es posible saberlo?

En otra dirección, de la API HBase Java, ¿cómo puedo saber el tipo de datos para un valor dado almacenado en una familia: calificador?

Gracias!

Respuesta

3

Para su primera pregunta puede intentar convertir a int y si tiene una excepción, sabe que es un String. Pero esta no es una buena manera.

+4

1: El lado negativo es que algunos de 32 bits 'int' valores son también cadenas válidas. –

5

A diferencia de un RDBMS tradicional, HBase no admite "columnas tipeadas", donde el almacén de datos realiza un seguimiento de los tipos de datos que se almacenan. HBase no realiza un seguimiento de forma nativa, por lo que no hay forma de contar de forma nativa, el tipo de datos almacenados en una columna. El desarrollador que usa HBase es responsable de realizar un seguimiento de los tipos de datos de columna por sí mismos.

Para muchas aplicaciones, es aceptable que la aplicación "codifique" los tipos de cada columna. De esta forma, las tablas de HBase tienden a ser más específicas de la aplicación que las tablas de RDBMS. Un desarrollador también puede crear una columna familiar o columna dedicada a un esquema de tipo de datos para la fila (por ejemplo, un esquema de Avro serializado como una cadena).

páginas "arquitectura" de la documentación HBase explica las diferencias entre HBase y un RDBMS tradicionales un poco más aquí:

https://hbase.apache.org/book/architecture.html#arch.overview.when

0

Use OrderedBytes mientras que almacena los valores. Lo que garantiza que cada tipo de datos tenga un prefijo con algunos valores numéricos. Consulte , https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/util/OrderedBytes.html

byte[] value = scanner.next().getValue(Bytes.toBytes(family), Bytes.toBytes(qualifier)); 
int typeByte = value[0] 
if(typeByte == 52) 
    // do operation for String 
else if(typeByte == 43) 
    // do operation for Integer 
else if (typeByte == 45) 
    // do operation for Double 

Nota: Los valores de 43,45 y 52 se adjunta al escribir los datos a hbase según tipo de datos.

Consulte un ejemplo en http://davidgreenshtein.blogspot.co.uk/2015/03/geo-spatial-search-in-hbase.html

+1

Agregue una explicación con la respuesta de cómo esta respuesta ayuda a OP en la edición de la edición actual –

+0

Agregue esto en la respuesta. –

Cuestiones relacionadas