我通过以下方式连接到远程 Cassandra DB:
from cassandra.cluster import Cluster
from cassandra.auth import PlainTextAuthProvider
from cassandra.query import dict_factory
cluster = Cluster(contact_points=[CASSANDRA_HOST], username='1',password='123')
session=cluster.connect()
然后,我想获取 Cassandra 中已有的键空间、表、列的列表。 在 cqlsh 中,它与
describe keyspace
一起使用。 我怎样才能在Python中做到这一点?
Cluster
的实例有一个metadata
字段,它是Metadata类的实例 - 它有keyspaces
成员,它是现有键空间的列表,迭代它你可以获得所有表,然后每个表 - 列等
DESCRIBE KEYSPACE
是 cqlsh
命令,尽管它可能会作为普通 CQL 命令被支持(不记得了,也许它将成为 4.0 版本的一部分)
除了集群元数据之外,
system_schema
键空间也是您的朋友! 您可以像下表中的任何其他数据一样SELECT
此数据:
system_schema.keyspaces
system_schema.tables
system_schema.columns
拉取列元数据可能如下所示:
strCCQL = "SELECT column_name,type FROM system_schema.columns WHERE keyspace_name=? AND table_name=?"
pcStatement = session.prepare(strCCQL)
pcStatement.consistency_level=ConsistencyLevel.LOCAL_ONE
crows = session.execute(pcStatement,[keyspace,table])
for crow in crows:
column = crow.column_name
type = crow.type
print (keyspace,table,column,type)
这个例子将所有内容放在一起。 但是您可以通过以类似的方式查询
keyspaces
和 tables
表来使用键空间和表名称数据作为种子。
我已经检查了您的要求,并说一旦您获得键空间名称,您就可以分开并相应地使用下面的代码;
注意:要从 Cassandra DB 获取表和视图的列表,我们还必须传递适当的键空间名称。
# Note: pip install cassandra-driver
import pandas as pd
from cassandra.cluster import Cluster
from cassandra.query import dict_factory
from cassandra.auth import PlainTextAuthProvider
def get_keyspace_list_and_view_names(HOST, PORT, USERNAME, PASSWORD, KEYSPACE_NAME):
"""
This method fetches the keyspace, list and view names from a given cassandra cluster
"""
try:
t_list, v_list, keyspace_list = [], [], []
cluster = Cluster(contact_points=[HOST], port=int(PORT), load_balancing_policy=None,
auth_provider=PlainTextAuthProvider(username=USERNAME, password=PASSWORD))
session = cluster.connect(KEYSPACE_NAME)
for i in session.execute("SELECT * FROM system_schema.keyspaces;"): keyspace_list.append(i.keyspace_name)
for i in session.execute("SELECT * FROM system_schema.tables WHERE keyspace_name = cassandra_test_keyspace;"): t_list.append(i.table_name)
for i in session.execute("SELECT * FROM system_schema.views WHERE keyspace_name = cassandra_test_keyspace;"): v_list.append(i.view_name)
except Exception as error_msg:
return error_msg
finally:
session.shutdown()
return keyspace_list, t_list, v_list
谢谢