如何在Cassandra中插入没有空值的列

时间:2016-01-06 16:14:58

标签: python cassandra datastax cql nosql

我正在尝试使用Python和DataStax驱动程序(Python - > Cassandra)在Cassandra数据库中存储一些推文。

一切都运作良好,但有一些我无法理解的东西。 如何插入没有空值的行?

例如,

CREATE TABLE tweets (

id_tweet text PRIMARY KEY,
texttweet text,
hashtag text,
url text,
)

如果我想插入没有url值的行,它可以正常工作,但在Cassandra中,我会在url列中看到“null”。

我查看了这个文档:

http://datastax.github.io/python-driver/getting_started.html#passing-parameters-to-cql-queries

所以我尝试了两种不同的方式:

首先,我将String创建为一个完整的String,然后执行它。

requete = "insert into Tweets(id_tweet,texttweet,hashtag,url) values ('%s','%s','%s','%s')"%(id_tweet,texttweet,hashtag,url)
session.execute(requete)

或者
我在执行函数中发送参数。

requete2 = "insert into Tweets(id_tweet,texttweet,hashtag,url) values ('%s','%s','%s','%s')"
session.execute(requete2,(id_tweet,id_texttweet,hashtag,url))

问题是,如果我的推文中没有URL或Hashtag,那么2种不同的方式会给我空值。

如果列连续为空,是否有可能看不到列,就像我在很多教程中看到的一样?

enter image description here

感谢。

1 个答案:

答案 0 :(得分:9)

如果您使用的是Cassandra 2.2或更高版本,则可以执行此操作。在Cassandra 2.2中引入了“UNSET”的概念。这允许您使用相同的语句来插入行,即使您不想提供某些值,以下是如何执行此操作:

from cassandra.query import UNSET_VALUE
ps = session.prepare("insert into tweets(id_tweet,texttweet,hashtag,url) values (?,?,?,?)")
session.execute(ps, ("id", "hello world!", UNSET_VALUE, UNSET_VALUE));

这表明cassandra你不想将这些值作为null插入,而是应该将它们全部一起省略,因此没有'null'值(在内部这些是墓碑)被插入到cassandra中。

在您方面,我认为您需要执行一些预处理逻辑,以将任何传入的None值转换为UNSET_VALUE。 2.2之前的解决方案是根据缺少的列调整您的查询,例如insert into tweets(id_tweet,texttweet) values (?,?)如果#标签符号为None

在检索端,技术上应该远离区分null和unset值(我将研究这个),但我不认为python驱动程序中存在这样的机制。如果可以在协议中执行,我将打开一张票,但驱动程序中没有该功能。 编辑:它看起来不像cassandra区分值显式设置为null(内部标记为墓碑)和返回数据时从未设置的那些。

您可以在this blog post中的python驱动程序中阅读有关“UNSET”和其他2.2功能的更多信息。