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

Posted

技术标签:

【中文标题】如何在 Column 中插入没有空值的 Cassandra【英文标题】:How insert in Cassandra without null value in Column 【发布时间】:2016-04-10 19:29:36 【问题描述】:

我正在尝试使用 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

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

第一个,我将字符串创建为一个完整的字符串,然后执行它。

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,则 2differents 方式会给我空值。

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

谢谢。

【问题讨论】:

【参考方案1】:

如果您使用的是 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 (?,?) 如果主题标签和 url 是 None

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

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

【讨论】:

以上是关于如何在 Column 中插入没有空值的 Cassandra的主要内容,如果未能解决你的问题,请参考以下文章

Apache Spark:如何使用 Java 在 dataFrame 中的空值列中插入数据

处理空值的最优雅方法是啥

如何插入具有空值的显式 id 属性的数据?

在sql中我设置列表的类型时没有设置为空,还有主键都设置了,为啥在ASP中输入的数据还是可以插入空值的

PHP - 从具有空值的日期列中插入日期时遇到问题。值在数组内

MySQL 中NULL和空值的区别