我有下表
create table test(
userId varchar,
notifId timeuuid,
notification varchar,
time bigint,read boolean,
primary key(userId, notifId)) with clustering order by (notifId desc);
Run Code Online (Sandbox Code Playgroud)
我正在运行以下查询:
PreparedStatement pstmt = session.prepare("INSERT INTO notifications(userId, notifId, notification, time, read) VALUES(?, now(), ?, ?, ?)");
BoundStatement boundStatement = new BoundStatement(pstmt);
session.execute(boundStatement.bind("123", "hello", new Date().getTime(), false));
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Exception in thread "main" com.datastax.driver.core.exceptions.InvalidQueryException: Type error: cannot assign result of function now (type timeuuid) to notifid (type 'org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.TimeUUIDType)')
at com.datastax.driver.core.exceptions.InvalidQueryException.copy(InvalidQueryException.java:35)
at com.datastax.driver.core.ResultSetFuture.extractCause(ResultSetFuture.java:277)
at com.datastax.driver.core.Session.toPreparedStatement(Session.java:281)
at com.datastax.driver.core.Session.prepare(Session.java:172)
at com.example.cassandra.SimpleClient.loadData(SimpleClient.java:130)
at com.example.cassandra.SimpleClient.main(SimpleClient.java:214) …Run Code Online (Sandbox Code Playgroud) 我们正在使用Cassandra解决的用例是:我们需要检索在过去90天内在特定时间范围内更新的实体UUID列表.想象一下,我们正在构建一个文档跟踪系统,因此我们的相关实体是一个Document,其关键是UUID.
我们在此用例中需要支持的查询是:查找StartDateTime和EndDateTime之间已更改的所有Document UUID.
问题1:支持此查询的最佳Cassandra表设计是什么?
我认为答案如下:
CREATE TABLE document_change_events (
event_uuid TIMEUUID,
document_uuid uuid,
PRIMARY KEY ((event_uuid), document_uuid)
) WITH default_time_to_live='7776000';
Run Code Online (Sandbox Code Playgroud)
鉴于我们不能对分区键进行范围查询,我们需要使用该token()方法.因此,查询将是:
SELECT document_uuid
WHERE token(event_uuid) > token(minTimeuuid(?))
AND token(event_uuid) < token(maxTimeuuid(?))
Run Code Online (Sandbox Code Playgroud)
例如:
SELECT document_uuid
WHERE token(event_uuid) > token(minTimeuuid('2015-05-10 00:00+0000'))
AND token(event_uuid) < token(maxTimeuuid('2015-05-20 00:00+0000'))
Run Code Online (Sandbox Code Playgroud)
问题2:我似乎无法使用DataStax的驱动程序获得以下Java代码,以确保可靠性返回正确的结果.
如果我运行以下代码10次,暂停30秒,我将在此表中有10行:
private void addEvent() {
String cql = "INSERT INTO document_change_events (event_uuid, document_uuid) VALUES(?,?)";
PreparedStatement preparedStatement = cassandraSession.prepare(cql);
BoundStatement boundStatement = new BoundStatement(preparedStatement);
boundStatement.setConsistencyLevel(ConsistencyLevel.ANY);
boundStatement.setUUID("event_uuid", UUIDs.timeBased());
boundStatement.setUUID("document_uuid", UUIDs.random());
cassandraSession.execute(boundStatement);
}
Run Code Online (Sandbox Code Playgroud)
结果如下:
cqlsh:> …Run Code Online (Sandbox Code Playgroud) 阻止从com.datastax.driver.core.Session执行fethod
public ResultSet execute(Statement statement);
Run Code Online (Sandbox Code Playgroud)
评论这种方法:
该方法阻塞,直到从数据库接收到至少一些结果.但是,对于SELECT查询,它不保证已完全接收结果.但它确实保证从数据库收到了一些响应,特别是保证如果请求无效,则此方法将抛出异常.
来自com.datastax.driver.core.Session的非阻塞执行方法
public ResultSetFuture executeAsync(Statement statement);
Run Code Online (Sandbox Code Playgroud)
此方法不会阻止.一旦查询传递到底层网络堆栈,它就会返回.特别是,从此方法返回并不保证查询有效或甚至已提交到活动节点.访问{@link ResultSetFuture}时,将抛出与查询失败有关的任何异常.
我有关于它们的02个问题,因此如果你能帮我理解它们会很棒.
假设我有100万条记录,我希望所有这些记录都能到达数据库(没有丢失).
问题1:如果我有n个线程,则所有线程将具有发送到数据库所需的相同数量的记录.所有这些都继续使用阻塞执行调用向cassandra发送多个插入查询.如果我增加n的值,它是否也有助于加快我需要将所有记录插入cassandra的时间?
这会导致cassandra的性能问题吗?Cassandra是否必须确保对于每个插入记录,群集中的所有节点都应立即知道新记录?为了保持数据的一致性.(我假设cassandra节点甚至不会考虑使用本地机器时间来控制记录插入时间).
问题2:通过非阻塞执行,我如何确保所有插入成功?我知道的唯一方法是等待ResultSetFuture检查插入查询的执行.有什么更好的办法吗?非阻塞执行更容易失败然后阻塞执行的可能性更高吗?
非常感谢您的帮助.
我在Cassandra中使用了宽行模式.我的表定义如下:
CREATE TABLE usertopics (
key text,
topic text,
score counter,
PRIMARY KEY (key, topic)
)
Run Code Online (Sandbox Code Playgroud)
我正在插入条目使用:
UPDATE usertopics SET score = score + ? WHERE key=? AND topic=?
Run Code Online (Sandbox Code Playgroud)
这样如果密钥不存在,它将插入,如果它存在,它将更新.
我正在删除使用的条目:
Delete form usertopics where key in ?
Run Code Online (Sandbox Code Playgroud)
但删除后,当我再次尝试更新时,它没有更新.它没有给出任何错误,但它也没有反映在db中.
当我截断表格时,它再次完美插入.我正在使用Datastax java驱动程序访问Cassandra.有什么建议?
我的代码直接执行准备好的绑定语句,没有任何确切的查询。那么如何获得它试图在 cassandra 数据库中执行的 cql?
例如:
public <T> void save(T entity) {
if (entity != null) {
Statement statement = getEntityMapper(entity).saveQuery(entity);
statement.setConsistencyLevel(consistencyLevelWrite);
mappingManager.getSession().execute(statement);
}
}
Run Code Online (Sandbox Code Playgroud)
我想得到类似INSERT INTO "keyspace"."tableName"("column1","column2") VALUES (value1,value2)
java cassandra datastax-enterprise datastax-java-driver datastax
TL; DR是我无法使用Java删除先前使用upsert创建的行.
基本上我有这样一个表:
CREATE TABLE transactions (
key text PRIMARY KEY,
created_at timestamp
);
Run Code Online (Sandbox Code Playgroud)
然后我执行:
String sql = "update transactions set created_at = toTimestamp(now()) where key = 'test' if created_at = null";
session.execute(sql)
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,行被创建:
cqlsh:thingleme> SELECT * FROM transactions ;
key | created_at
------+---------------------------------
test | 2018-01-30 16:35:16.663000+0000
Run Code Online (Sandbox Code Playgroud)
但是(这是让我发疯的原因)如果我执行:
sql = "delete from transactions where key = 'test'";
ResultSet resultSet = session.execute(sql);
Run Code Online (Sandbox Code Playgroud)
什么都没发生.我的意思是:没有抛出异常而且行仍在那里!
其他一些奇怪的东西:
我的环境:
关于如何解决这个问题的任何想法/建议真的很感激;-)
使用maxTimeuuid和minTimeuuid的查询的Java API是什么?我在QueryBuilder或其他任何地方找不到任何内容.我正在使用DataStax客户端
<artifactId>cassandra-driver-core</artifactId>
<version>1.0.3</version>
Run Code Online (Sandbox Code Playgroud)
表"a"有2列:1.类型为String的id 2.类型为TimeUuid的LMD
这就是我在做什么,似乎不对,当然不起作用
Query q = QueryBuilder
.select()
.all()
.from("test","a")
.where().and(QueryBuilder.gt("LMD", "minTimeUUid('2013-11-03 14:33:50')"))
.and(QueryBuilder.lt("LMD", "maxTimeUUId('2013-11-03 14:45:50')"));
Run Code Online (Sandbox Code Playgroud)
任何指针都非常感谢
谢谢
我有一个列类型为的表
text, bigint, set<text>
Run Code Online (Sandbox Code Playgroud)
我正在尝试更新单行并使用QueryBuilder向集合添加元素.
覆盖现有集的代码如下所示(注意这是scala):
val query = QueryBuilder.update("twitter", "tweets")
.`with`(QueryBuilder.set("sinceid", update.sinceID))
.and(QueryBuilder.set("tweets", setAsJavaSet(update.tweets)))
.where(QueryBuilder.eq("handle", update.handle))
Run Code Online (Sandbox Code Playgroud)
我能够找到实际的CQL来为一个集合添加一个元素:
UPDATE users
SET emails = emails + {'fb@friendsofmordor.org'} WHERE user_id = 'frodo';
Run Code Online (Sandbox Code Playgroud)
但是找不到使用QueryBuilder的例子.
基于CQL,我也尝试过:
.and(QueryBuilder.set("tweets", "tweets"+{setAsJavaSet(update.tweets)}))
Run Code Online (Sandbox Code Playgroud)
但它没有用.提前致谢
我在删除表中的所有记录时遇到问题.
我可以使用Truncate表.但truncate会创建数据的快照,这可能是我方案中存储空间的浪费.
如果任何节点关闭,截断也会失败.
所以我想知道是否有任何方法可以删除表中的所有记录而不创建在节点关闭时有效的快照.
cassandra datastax-java-driver datastax cassandra-2.0 cassandra-2.1
如果架构已满或无架构,我感到困惑DataStax graph .
我问这个问题,因为 入门教程 告诉创建架构.但我key-value在边缘属性上插入随机并DSE graph接受它而没有错误.
如果我在DSE-Graph上插入随机Vertex或edge属性(键值)会有问题吗?
datastax-enterprise datastax-java-driver datastax datastax-startup datastax-enterprise-graph