在运行时以编程方式确定 Cassandra 列

programmatically determining Cassandra columns at runtime

我正在访问 Cassandra 数据库,但我只知道 table 个名称。

我想发现列的名称和类型。

这将给我列名:

select column_name 
  from system.schema_columns 
where columnfamily_name = 'customer' 
allow filtering;

这样合理吗?

有人对确定列类型有什么建议吗?

您可以通过查看用于验证器的 类 来推断列类型。验证器列只是一个字符串。

该字符串具有以下 3 种格式之一:

org.apache.cassandra.db.marshal.XXXType 用于简单列类型,其中 XXX 是列的 Java 类型(例如,对于 bigint 列,XXX 是 "Long",对于 varchar/text,XXX是 "UTF8",等等)

org.apache.cassandra.db.marshal.SetType(org.apache.cassandra.db.marshal.XXXType) 用于集合列,其中括号中的类型为每个集合元素的类型

org.apache.cassandra.db.marshal.MapType(org.apache.cassandra.db.marshal.XXXType,org.apache.cassandra.db.marshal.XXXType) 对于地图

根据您使用的驱动程序,您应该能够使用元数据 API。

举几个例子:

http://datastax.github.io/python-driver/api/cassandra/metadata.html#schemas https://datastax.github.io/java-driver/features/metadata/#schema-metadata

驱动程序查询系统架构元数据以创建这些模型。

很老但仍然有效的问题。您的模型有一个 class 变量描述列(字段名称和列 class):

class Tweet(cqldb.Model):
    """
    Object representing the tweet column family in Cassandra
    """
    __keyspace__ = 'my_ks'
    # follows model definition
    ...
    ...

print(Tweet._defined_columns)

# output

OrderedDict([('tweetid',
                        <cassandra.cqlengine.columns.Text at 0x7f4a4c9b66a0>),
                       ('tweet_id',
                        <cassandra.cqlengine.columns.BigInt at 0x7f4a4c9b6828>),
                       ('created_at',
                        <cassandra.cqlengine.columns.DateTime at 0x7f4a4c9b6748>),
                       ('ttype',
                        <cassandra.cqlengine.columns.Text at 0x7f4a4c9b6198>),
                       ('tweet',
                        <cassandra.cqlengine.columns.Text at 0x7f4a4c9b6390>),
                       ('lang',
                        <cassandra.cqlengine.columns.Text at 0x7f4a4c9b3d68>)])