如何在 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 中的空值列中插入数据
在sql中我设置列表的类型时没有设置为空,还有主键都设置了,为啥在ASP中输入的数据还是可以插入空值的