解决 java: convertir el tipo de blob de cassandra en cadena

 

Tengo una familia de columnas antigua que tiene una columna llamada "valor" que se definió como un tipo de datos de blob. Esta columna generalmente contiene dos números separados con un guión bajo, como "421_2".

Cuando estoy usando el controlador de datastax de python y ejecuto la consulta, los resultados regresan con ese campo analizado como una cadena:

In [21]: session.execute(q)
Out[21]: 
[Row(column1=4776015, value='145_0'),
 Row(column1=4891778, value='114_0'),
 Row(column1=4891780, value='195_0'),
 Row(column1=4893662, value='105_0'),
 Row(column1=4893664, value='115_0'),
 Row(column1=4898493, value='168_0'),
 Row(column1=4945162, value='148_0'),
 Row(column1=4945163, value='131_0'),
 Row(column1=4945168, value='125_0'),
 Row(column1=4945169, value='211_0'),
 Row(column1=4998426, value='463_0')]

Cuando uso el controlador java obtengo un objeto com.datastax.driver.core.Row. Cuando intento leer el campo de valor, por ejemplo,  row.getString("value") obtengo el esperado  InvalidTypeException: Column value is of type blob. Parece que la única forma de leer el campo es a través de  row.getBytes("value") y luego recupero un  java.nio.HeapByteBuffer objeto.

El problema es que no puedo convertir este objeto en una cadena de una manera fácil. Google arrojó dos respuestas de 2012 que sugieren lo siguiente:

String string_value = new String(result.getBytes("value"), "UTF-8");

Pero ese constructor de cadenas ya no parece existir. Entonces, mis preguntas son:

  1. ¿Cómo convierto HeapByteBuffer en cadena?
  2. ¿Cómo es que el controlador de Python convirtió el blob fácilmente y el de Java no?

Nota al margen: podría depurar el controlador de Python, pero actualmente parece demasiado trabajo para algo que debería ser trivial. (y el hecho de que nadie preguntó al respecto sugiere que me estoy perdiendo algo simple aquí ...)

java  cassandra  blob  cql  datastax 
 | 
  esta pregunta se
 hizo el 4 de agosto de 15 a las 17:37  idoda  1.329 3 19 36



 El | 

respuestas
4

Solución

Otra forma más fácil es cambiar la declaración CQL.

select column1, blobastext(value) from YourTable where key = xxx

La segunda columna sería tipo de cadena.


 El | 
  esta respuesta
 respondió el 5 de agosto de 2015 a las 1:26  popcorny  677 7 9 Me gusta esta, pero no estoy seguro de lo fácil que es incorporarla en el controlador de Java ... voy a verificar. -   idoda  5 de agosto de 15 a 8:33 No encontré una manera de aplicar una función a una columna seleccionada en el objeto Java QueryBuilder suministrado por Datastax. De lo contrario, habría sido una solución muy elegante. -   idoda  5 de agosto de 15 a 12:45 ¿Por qué no lo usas  session.execute("select column, ....") directamente? Si necesita usar QueryBuilder, pruebe  Selection.Selection :: fcall . Estoy muy seguro de que blobastext funciona en el controlador java, porque lo usé en mi proyecto de producción. -   popcorny 5 de agosto de 2015 a las 14:20 ¿Sabes cómo crear programáticamente un blob a partir de una cadena? la llamada solo está disponible en la selección por alguna razón. ¿Qué sucede si ahora necesito actualizar, por ejemplo, una columna de blob? -   idoda 10 de agosto de 15 a las 12:25 @idoda debería ser textAsBlob (?) -   Andrew James Ramirez  16 de junio de 16 a las 8:24



 El | 

También puede obtener acceso directo a los serializadores del controlador Java. De esta manera, no tiene que lidiar con detalles de bajo nivel, y también funciona para otros tipos.

Driver 2.0.x:

String s = (String)DataType.text().deserialize(byteBuffer);

Conductor 2.1.x:

ProtocolVersion protocolVersion = cluster.getConfiguration().getProtocolOptions().getProtocolVersion();
String s = (String)DataType.text().deserialize(byteBuffer, protocolVersion);

Conductor 2.2.x:

ProtocolVersion protocolVersion = cluster.getConfiguration().getProtocolOptions().getProtocolVersion();
String s = TypeCodec.VarcharCodec.instance.deserialize(byteBuffer, protocolVersion);


 El | 
  esta respuesta
 respondió el 4 de agosto de 2015 a las 20:00  Olivier Michallat  1,534 3 8 1 ¡Gran respuesta! Enumerar cómo difiere la versión de cada controlador también ayudará mucho a los demás. -   Aaron  4 de agosto de 15 a 20:02 @ BryceAtNetwork23 Estoy de acuerdo, respuesta elaborada, gracias Olivier! -   idoda  5 de agosto de 15 a 8:45 ¿Alguna idea de si es posible hacer el TypeCodec dinámicamente en función de lo que es DataType.getType ()? Estoy tratando de convertir una biblioteca que usa este enfoque bastante a 2.2. -   Artii  20 de noviembre de 15 a 18:04 ¿Alguna idea para el controlador 3.0.x? ¿Dónde lo encontraste? -   Andrew James Ramirez  16 de junio de 16 a 8:59



 El | 

1.) La conversión del búfer de bytes en Java se trata en  esta respuesta .

2.) Suponiendo que estás usando Python 2, vuelve como una cadena en Python porque str es el tipo binario.


 El | 
  esta respuesta
 respondió el 4 de agosto de 2015 a las 19:00  Adam Holmberg  4,884 2 22 42 ¿Y en Java? ¿puedes elaborar más? gracias :) -   idoda  5 de agosto de 15 a 8:33



 El | 

Para la versión 3.1.4 del controlador datastax java, lo siguiente convertirá un blob en una cadena:

ProtocolVersion proto = cluster.getConfiguration().getProtocolOptions().getProtocolVersion();

String deserialize = TypeCodec.varchar().deserialize(row.getBytes(i), proto);
Publicado 19 artículos originales · elogiado 4 · 170,000 vistas +

Supongo que te gusta

Origin blog.csdn.net/u011250186/article/details/105340367
Recomendado
Clasificación