TypeError:使用一组 UDT 创建 Cassandra Python 驱动程序模型时不可散列的类型 UserType

Posted

技术标签:

【中文标题】TypeError:使用一组 UDT 创建 Cassandra Python 驱动程序模型时不可散列的类型 UserType【英文标题】:TypeError: Unhashable type UserType when creating a Cassandra Python driver model with a Set of a UDT 【发布时间】:2016-08-28 21:57:57 【问题描述】:

此问题与 Datastax Cassandra python 驱动程序的对象映射器有关。 尝试使用 UDT 的“集”作为字段创建模型时,出现错误: TypeError: unhashable type: '[UdtClassName]'

但是,我可以创建具有基本类型(例如文本)集的模型或具有 UDT 列表的模型。

请注意,这个问题似乎只存在于对象映射器中,因为我能够使用 CQL 查询在 Cassandra 中创建 UDT 集。

有人遇到过这个问题吗?有人给点建议吗?

我正在使用 python 3.4.4 运行 cassandra python 驱动程序 3.2.2

【问题讨论】:

【参考方案1】:

这在 Cassandra 中是可能的(并直接使用核心驱动程序),但 cqlengine 映射器目前不支持它。原因是遗留 API 限制,其中映射器规范化为集合和映射的基本 python 类型。因此,API 对集合元素和映射键具有相同的哈希性要求。

我们有一张票here,但它需要等待下一个主要版本,因为这意味着 API 会发生变化。

您可以尝试通过在您的 UDT 模型类上提供哈希来解决此问题(如果有意义的话)。

【讨论】:

好的,非常感谢您的建议!实现 hash 现在确实可以,但是您是否预见到简单地实现它可能会出现任何问题?这似乎太容易了,我对 hash ... 没有太多经验 一个陷阱是,如果您的 UDT 具有可变元素,这些元素可以在散列进入集合后更改散列。如果您在每个集合的生命周期中将对象视为常量,我预计不会有任何问题。 澄清一下,在我之前的评论中,我的意思是写 __hash___,而不是 hash 如何在 UDT 集上使用哈希?任何例子,都会有很大帮助【参考方案2】:

从 Adam 扩展,在 UserType 上使用哈希

class Client(UserType):
   mac = columns.Text()
   rx = columns.Integer()
   tx = columns.Integer()

   def __hash__(self):
      return hash((self.mac, self.rx, self.tx))

谢谢亚当。

【讨论】:

以上是关于TypeError:使用一组 UDT 创建 Cassandra Python 驱动程序模型时不可散列的类型 UserType的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra List<UDT> 未使用 datastax java driver 4.0.0 反序列化

Spark CountVectorizer返回udt而不是向量[重复]

Oracle OCI操作UDT相关学习

如何批量收集到子查询中的 UDT 类型

UDT中的epoll

UDT中的epoll