在运行时以编程方式确定 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>)])
我正在访问 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>)])