将python dict序列化为cassandra1.2列

9rygscc1  于 2021-06-15  发布在  Cassandra
关注(0)|答案(2)|浏览(330)

问题
我试图将序列化对象(使用cpickle)保存到cassandra1.2列中,我使用的是python cql库。我已经尝试过将列定义为text(utf8 string)和blob,在这两种情况下我都收到相同的错误:
对象是python dict:

obj = {'id':'sometextid',
       'time_created':05/12/2013, #<---- datetime
       'some other string property': 'some other value'
}

错误如下:

raise cql.ProgrammingError("Bad Request: %s" % ire.why)
cql.apivalues.ProgrammingError: Bad Request: line 31:36 no viable alternative at character '\'

查看已执行的cql语句,我可以看到在对对象进行酸洗后的一些“\”字符,例如:
腌制对象的一部分

cdatetime
datetime
p4
(S'\x07\xdd\x03\x1c\x000\x13\x05\xd0<'
tRp5

我的问题
使用cql库序列化python dict(包括datetimes)以将其保存到cassandra1.2中的常用方法是什么?有更好或更直接的方法吗?
提前谢谢!

w8f9ii69

w8f9ii691#

此问题的完整解决方案是将列定义为blob,并以这种方式包含一个encode to hex(如cassandra文档中针对blob类型的定义):

obj_to_store = cPickle.dumps(input_obj).encode("hex")

通过这种方式,您可以序列化一个常规的python dict。使用regular,我的意思是它可以包含python dict可以包含的任何内容,包括datetimes或您想要的任何内容,它将被正确序列化并存储在cassandra中。
也许有一个更好的解决方案,但到目前为止,这是我发现的唯一一个真正适用于任意python dict的解决方案。
希望它能帮助别人!

col17t5w

col17t5w2#

听起来你的cql库解析字符串有问题。在修复之前,一种方法是使用struct将pickle转换为压缩字符串。
或者,可以使用urllib之类的方法更改有问题值的编码

相关问题