ido*_*oda 5 java blob cql cassandra datastax
我有一个旧的列系列,它有一个名为"value"的列,它被定义为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')]
Run Code Online (Sandbox Code Playgroud)
当我使用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");
Run Code Online (Sandbox Code Playgroud)
但是这样的String构造函数似乎不再存在.所以,我的问题是:
旁注:我可以调试python驱动程序,但是目前这对于一些应该是微不足道的东西来说似乎太多了.(事实上,没有人问过它,这表明我在这里错过了一些简单的事情......)
pop*_*rny 12
另一种更简单的方法是更改CQL语句.
select column1, blobastext(value) from YourTable where key = xxx
Run Code Online (Sandbox Code Playgroud)
第二列是String类型.
您还可以直接访问Java驱动程序的序列化程序.这样您就不必处理低级细节,它也适用于其他类型.
驱动程序2.0.x:
String s = (String)DataType.text().deserialize(byteBuffer);
Run Code Online (Sandbox Code Playgroud)
驱动程序2.1.x:
ProtocolVersion protocolVersion = cluster.getConfiguration().getProtocolOptions().getProtocolVersion();
String s = (String)DataType.text().deserialize(byteBuffer, protocolVersion);
Run Code Online (Sandbox Code Playgroud)
驱动程序2.2.x:
ProtocolVersion protocolVersion = cluster.getConfiguration().getProtocolOptions().getProtocolVersion();
String s = TypeCodec.VarcharCodec.instance.deserialize(byteBuffer, protocolVersion);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15217 次 |
| 最近记录: |