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

时间:2015-11-11 14:05:10

标签: cassandra cassandra-2.0

我正在访问一个Cassandra数据库,我只知道表名。

我想发现这些名字&列的类型。

这将为我提供列名:

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

这是否合理?

有没有人有关于确定列类型的建议?

3 个答案:

答案 0 :(得分:3)

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

几个例子:

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

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

答案 1 :(得分:0)

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

字符串有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)

答案 2 :(得分:0)

非常古老但仍然有效的问题。模型中有一个用于描述列的类变量(字段名称和列类):

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>)])