将cassandra blob类型转换为字符串

时间:2015-08-04 17:37:14

标签: java cassandra blob cql datastax

我有一个旧列系列,其列名为"值"它被定义为blob数据类型。此列通常包含两个用下划线分隔的数字,例如" 421_2"。

当我使用python datastax驱动程序并执行查询时,结果返回时将该字段解析为字符串:

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')]

当我使用java驱动程序时,我得到一个com.datastax.driver.core.Row对象。当我尝试读取值字段时,例如,row.getString("value")我得到了预期的InvalidTypeException: Column value is of type blob。看起来像是通过row.getBytes("value")读取字段的唯一方法然后我找回了java.nio.HeapByteBuffer对象。

问题是,我似乎无法以简单的方式将此对象转换为字符串。谷歌搜索从2012年得到了两个答案,表明以下内容:

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

但是这样的String构造函数似乎不再存在了。 所以,我的问题是:

  1. 如何将HeapByteBuffer转换为字符串?
  2. 为什么python驱动程序很容易转换blob并且java那个没有?
  3. 旁注: 我可以调试python驱动程序,但目前看起来似乎太多工作应该是微不足道的。 (事实上​​,没有人问过这个事实表明我在这里错过了一些简单的事情......)

4 个答案:

答案 0 :(得分:9)

另一种更简单的方法是更改​​CQL语句。 从YourTable中选择column1,blobastext(value),其中key = xxx 第二列是String类型。

答案 1 :(得分:8)

您还可以直接访问Java驱动程序的序列化程序。这样您就不必处理低级细节,它也适用于其他类型。

Driver 2.0.x:

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

Driver 2.1.x:

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

驱动程序2.2.x:

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

答案 2 :(得分:1)

对于datastax java驱动程序的3.1.4版,以下内容将blob转换为字符串:

cordova-plugin-secure-storage

答案 3 :(得分:0)

1。)在this answer中讨论了从Java中的字节缓冲区转换。

2。)假设您正在使用Python 2,它将在Python中作为字符串返回,因为str是二进制类型。