如何将 ByteBuffer 转换为 blob 以进行 cassandra 插入?
How to convert ByteBuffer to blob for cassandra insertion?
我有一个 java.nio.ByteBuffer
,我需要将其传递给 Cassandra table,它有一个字段作为 blob。
这是玩具示例的相关代码:
val ww = "65984jg3oiqh4g3q383423932824344"
val www = getBytes(ww)
val wwww = LongTupleHashFunction.xx128().hashBytes(www)
val wwwww = ByteBuffer.allocate(128).putLong(wwww(0)).putLong(wwww(1))
wwwww.order(ByteOrder.BIG_ENDIAN)
val d_q = "DROP TABLE example.test "
val t_q = "CREATE TABLE example.test (hash_aggregation_key blob, PRIMARY KEY (hash_aggregation_key)) "
cassandraSession.execute(d_q)
cassandraSession.execute(t_q)
val ps: PreparedStatement = cassandraSession.prepare("insert into " + Constants.FEATURE_KEYSPACE + "." +
Constants.FEATURE_TABLE + "(hash_aggregation_key) VALUES(?) USING TTL 100000")
val bStatement: BoundStatement = ps.bind
bStatement.setList("hash_aggregation_key",wwwww)
cassandraSession.execute(bStatement)
这个 Whosebug 说要使用“setList”:
但是我没有字节列表,我有一个 ByteBuffer。另外,另一个问题是它告诉我 Cannot resolve overloaded method 'setList'
.
这个 Whosebug 似乎可以回答我的问题,但有趣的是,他们实际上并没有任何 cassandra 代码,这都是关于包装的:https://codereview.stackexchange.com/questions/32556/storing-a-bytebuffer-into-a-cassandra-database
我想这可能有我要找的东西,但我找不到他们实际转换和插入 blob 的位置:https://github.com/DataStax-Examples/blobs-java/blob/master/src/main/java/com/datastax/examples/BlobsApp.java
这似乎暗示我应该使用 setBytes。但是,我仍然收到 Cannot resolve overloaded method 'setBytes'
错误,所以我很困惑是什么原因造成的。
确切的解决方案可能取决于所用驱动程序的版本 (3.x vs 4.x)。
在最简单的情况下,您只需要做(调用 .bind
时指定所有参数):
val bStatement: BoundStatement = ps.bind(wwwww)
cassandraSession.execute(bStatement)
或者你可以使用 .setBytes
function(在 3.x 中)如果你想按名称绑定:
val bStatement: BoundStatement = ps.bind
bStatement.setBytes("hash_aggregation_key",wwwww)
cassandraSession.execute(bStatement)
或 .setByteBuffer
function(在 4.x 中)- 注意它不进行就地赋值,而是 returns 一个新实例:
val bStatement: BoundStatement = ps.bind.setByteBuffer("hash_aggregation_key",wwwww)
cassandraSession.execute(bStatement)
我有一个 java.nio.ByteBuffer
,我需要将其传递给 Cassandra table,它有一个字段作为 blob。
这是玩具示例的相关代码:
val ww = "65984jg3oiqh4g3q383423932824344"
val www = getBytes(ww)
val wwww = LongTupleHashFunction.xx128().hashBytes(www)
val wwwww = ByteBuffer.allocate(128).putLong(wwww(0)).putLong(wwww(1))
wwwww.order(ByteOrder.BIG_ENDIAN)
val d_q = "DROP TABLE example.test "
val t_q = "CREATE TABLE example.test (hash_aggregation_key blob, PRIMARY KEY (hash_aggregation_key)) "
cassandraSession.execute(d_q)
cassandraSession.execute(t_q)
val ps: PreparedStatement = cassandraSession.prepare("insert into " + Constants.FEATURE_KEYSPACE + "." +
Constants.FEATURE_TABLE + "(hash_aggregation_key) VALUES(?) USING TTL 100000")
val bStatement: BoundStatement = ps.bind
bStatement.setList("hash_aggregation_key",wwwww)
cassandraSession.execute(bStatement)
这个 Whosebug 说要使用“setList”:
但是我没有字节列表,我有一个 ByteBuffer。另外,另一个问题是它告诉我 Cannot resolve overloaded method 'setList'
.
这个 Whosebug 似乎可以回答我的问题,但有趣的是,他们实际上并没有任何 cassandra 代码,这都是关于包装的:https://codereview.stackexchange.com/questions/32556/storing-a-bytebuffer-into-a-cassandra-database
我想这可能有我要找的东西,但我找不到他们实际转换和插入 blob 的位置:https://github.com/DataStax-Examples/blobs-java/blob/master/src/main/java/com/datastax/examples/BlobsApp.java
这似乎暗示我应该使用 setBytes。但是,我仍然收到 Cannot resolve overloaded method 'setBytes'
错误,所以我很困惑是什么原因造成的。
确切的解决方案可能取决于所用驱动程序的版本 (3.x vs 4.x)。
在最简单的情况下,您只需要做(调用 .bind
时指定所有参数):
val bStatement: BoundStatement = ps.bind(wwwww)
cassandraSession.execute(bStatement)
或者你可以使用 .setBytes
function(在 3.x 中)如果你想按名称绑定:
val bStatement: BoundStatement = ps.bind
bStatement.setBytes("hash_aggregation_key",wwwww)
cassandraSession.execute(bStatement)
或 .setByteBuffer
function(在 4.x 中)- 注意它不进行就地赋值,而是 returns 一个新实例:
val bStatement: BoundStatement = ps.bind.setByteBuffer("hash_aggregation_key",wwwww)
cassandraSession.execute(bStatement)