当前位置: 首页 > 知识库问答 >
问题:

卡桑德拉准备了带有集合的报表

长孙波鸿
2023-03-14

我已经开始使用DataTax PHP驱动程序学习PHP中的Cassandra,我必须使用准备好的语句在CQL中设置映射的值,查询是:

INSERT INTO users (name, attributes, mail, password) VALUES (?, ?, ?, ?);

提交的“属性”是MAP类型,因此我尝试将其作为字符串传递:

{'address':'address...','phone':'phone...'}

在PHP中:

$attr = "{'address':'address...','phone':'phone...'}";
$statement = $session->prepare("INSERT INTO users (name, attributes, mail, password) VALUES (?, ?, ?, ?);");
$session->execute($statement, new Cassandra\ExecutionOptions(array('arguments' => array($name, $attr, $mail, $password))));

但是我得到了错误“java.lang.IllegalArgumentException”,对于准备好的语句中的映射或列表之类的集合,哪种语法是正确的?

共有2个答案

施振海
2023-03-14

以防给别人省点时间…

我的“目标”列是一组,而不是地图 - 但希望相同的原则适用于任何集合。我发现下面的代码可以删除批处理语句中设置的“目标”的特定元素:

$batch = new Cassandra\BatchStatement(Cassandra::BATCH_LOGGED);
$deleteTargetStmt = "DELETE targets[?] FROM $this->keyspace.user WHERE userid=?";
$targetPrepStmt = $this->session->prepare($deleteTargetStmt);
$batch->add($targetPrepStmt, array(new Cassandra\Timeuuid($targetId), new Cassandra\Uuid($userId)));
... other batch statement ommitted ...
$this->session->execute($batch);

事实上,这实际上与非准备语句的语法相同。但是我花了很长时间才发现,我必须在add的参数上调用new Timeuuid和uuid!

茅炯
2023-03-14

首先,用php创建一个地图或列表。然后在batchstatment中提供该映射或列表的对象。可以再做一个;而不创建batchstatment。直接写查询,已经通过了就可以通过了。

 类似资料:
  • 引用这篇文章: http://www.datastax.com/dev/blog/4-simple-rules-when-using-the-datastax-drivers-for-cassandra Cassandra的存储引擎进行了优化,以避免存储不必要的空列,但是当使用预准备语句时,那些未提供的参数会导致空值被传递给Cassandra(从而存储墓碑)。目前,这种情况的唯一解决方法是为最常见

  • 我正在使用Cassandra作为我的一个应用程序。我想使用Cassandra通过cql提供的Prepared语句。如果我准备了一个查询,这是否在所有节点中都准备好了?。 任何帮助是值得赞赏的。

  • 我们对DataStax Cassandra的查询使用缓存的准备声明。但是,如果我们需要向表中添加新列,我们需要重新启动应用程序服务器以重新缓存准备好的语句。 我在卡珊德拉遇到了这个错误,这解释了https://datastax-oss.atlassian.net/browse/JAVA-420的解决方案 它基本上提供了一种解决方法,在查询中不使用“SELECT*FROM table”,而是使用“s

  • 我需要找出Cassandra表中的记录计数是否大于一定的数字,例如10000。 我仍然没有大的数据集,但在大规模下,可能有数十亿条记录,我如何能够有效地实现这一点? 可能有几十亿张唱片,或者只有几千张。我只需要知道是多还是少10K。 这下面似乎是不对的,我认为它将失败或非常缓慢的大量记录。 从sourceId={id}和timestamp<{endDate}和timestamp>{startDat

  • 我正试图用Python插入到这个Cassandra表中 有了这份准备好的声明: 使用这段代码(数据库已打开并插入到其他表,因此连接有效): 我捕获了异常:“为 bind() 提供的参数太多(得到 12 个,预期为 4)”。 绑定函数是如何将我的4个参数转换为12个的? 希望有什么办法来解决这个问题? 或者,一些使用卡桑德拉MAP,LIST和SET的工作示例,从Python驱动程序将不胜感激。

  • 我并不完全理解预准备语句的概念,但是根据python驱动程序文档,预准备语句是< code >“针对至少一个Cassandra节点准备的语句”。对我来说,在集群中的某个地方有关于已经准备好的查询的信息。该文档还规定< code >“prepared statement应该只准备一次。重新准备语句可能会影响性能(因为该操作需要网络往返),"。 如果我的概念是正确的,那么从集群中接收已经准备好的语句而