将cassandra blob类型转换为字符串
Converting cassandra blob type to string
我有一个旧的列族,它有一个名为 "value" 的列,它被定义为 blob 数据类型。此列通常包含两个用下划线分隔的数字,例如“421_2”。
当我使用 python datastax 驱动程序并执行查询时,结果 return 将该字段解析为字符串:
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构造函数好像已经不存在了。
所以,我的问题是:
- 如何将 HeapByteBuffer 转换为字符串?
- 为什么 python 驱动程序可以轻松转换 blob 而 java 驱动程序却不能?
旁注:
我可以调试 python 驱动程序,但目前对于一些本应微不足道的事情来说,这似乎工作量太大了。 (而且没有人问过这一事实表明我在这里遗漏了一些简单的东西..)
1.) 从 Java 中的字节缓冲区转换在 this answer 中讨论。
2.) 假设您正在使用 Python 2,它在 Python 中作为字符串返回,因为 str 是二进制类型。
您还可以直接访问 Java driver 的序列化程序。这样你就不用去处理low-level的细节了,对其他类型也同样适用。
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);
Driver 2.2.x:
ProtocolVersion protocolVersion = cluster.getConfiguration().getProtocolOptions().getProtocolVersion();
String s = TypeCodec.VarcharCodec.instance.deserialize(byteBuffer, protocolVersion);
另一种更简单的方法是更改 CQL 语句。
select column1, blobastext(value) from YourTable where key = xxx
第二列是字符串类型。
对于版本 3.1.4 的 datastax java 驱动程序,以下将 blob 转换为字符串:
ProtocolVersion proto = cluster.getConfiguration().getProtocolOptions().getProtocolVersion();
String deserialize = TypeCodec.varchar().deserialize(row.getBytes(i), proto);
我有一个旧的列族,它有一个名为 "value" 的列,它被定义为 blob 数据类型。此列通常包含两个用下划线分隔的数字,例如“421_2”。
当我使用 python datastax 驱动程序并执行查询时,结果 return 将该字段解析为字符串:
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构造函数好像已经不存在了。 所以,我的问题是:
- 如何将 HeapByteBuffer 转换为字符串?
- 为什么 python 驱动程序可以轻松转换 blob 而 java 驱动程序却不能?
旁注: 我可以调试 python 驱动程序,但目前对于一些本应微不足道的事情来说,这似乎工作量太大了。 (而且没有人问过这一事实表明我在这里遗漏了一些简单的东西..)
1.) 从 Java 中的字节缓冲区转换在 this answer 中讨论。
2.) 假设您正在使用 Python 2,它在 Python 中作为字符串返回,因为 str 是二进制类型。
您还可以直接访问 Java driver 的序列化程序。这样你就不用去处理low-level的细节了,对其他类型也同样适用。
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);
Driver 2.2.x:
ProtocolVersion protocolVersion = cluster.getConfiguration().getProtocolOptions().getProtocolVersion();
String s = TypeCodec.VarcharCodec.instance.deserialize(byteBuffer, protocolVersion);
另一种更简单的方法是更改 CQL 语句。
select column1, blobastext(value) from YourTable where key = xxx
第二列是字符串类型。
对于版本 3.1.4 的 datastax java 驱动程序,以下将 blob 转换为字符串:
ProtocolVersion proto = cluster.getConfiguration().getProtocolOptions().getProtocolVersion();
String deserialize = TypeCodec.varchar().deserialize(row.getBytes(i), proto);