【问题标题】:How to list all column names in a column family in Cassandra?如何在 Cassandra 中列出列族中的所有列名?
【发布时间】:2012-07-08 18:51:16
【问题描述】:

我正在使用 Cassandra,我想制作一个显示任何列族内容的数据浏览器。我需要获取列名来配置 UI 网格。是否可以收集所有行中的列名?

【问题讨论】:

    标签: java cassandra hector


    【解决方案1】:

    最好的方法,如果您使用的是 Cassandra 1.1:

    SELECT column_name FROM system.schema_columnfamilies WHERE keyspace_name = X AND columnfamily_name = Y
    

    另见http://www.datastax.com/dev/blog/schema-in-cassandra-1-1

    【讨论】:

    • 这看起来是最方便的解决方案。我现在使用的是 Cassandra 1.0.9,所以我不能尝试这个。
    • 对于 Cassandra 1.2(显然...我使用的是 2.0.4)您需要查询 schema_columnsSELECT column_name FROM system.schema_columns WHERE keyspace_name = ? AND columnfamily_name = ?
    【解决方案2】:

    这个答案有几个部分。

    首先,要回答您的具体问题,您应该使用 sliceQuery 来获取一行中的所有列。传递一个空的 ByteBuffer 作为开始和结束值来有效地请求所有列:

    ByteBuffer empty = ByteBufferUtil.EMPTY_BYTE_BUFFER;       
    sliceQuery.setRange(empty,empty,false,100);
    

    其次,您需要对存储在列族中的数据模型进行假设。

    如果数据模型是静态的(每个对象一行,每个属性一列),那么您返回的列名应该是您要显示的列名。但是,如果数据是以动态方式存储的(每列一个对象,具有相同主键的所有对象都存储在同一行中) - 例如在时间序列中 - 那么您需要了解列是如何存储的需要解释名称(可能是复合名称)。动态方法的另一个非常常见的用途是通过 CQL 定义列族时的持久化方式。

    我应该补充一点,没有办法知道列族是如何用于存储对象的。您可以查询架构,但这仅告诉您数据在持久化时如何格式化,而不是数据(和属性名称)如何序列化和反序列化。

    【讨论】:

    • 抱歉,在获取一行中的所有列之前,我需要获取该行,并且我需要知道行键才能执行此操作。就我而言,我只知道列族的名称,而对其中的行一无所知。所以我想做的是扫描所有行并收集行ID,或者至少扫描特定列的所有值。附言我来自一个关系世界,而 Cassandra 让我很难过。
    • 所以你的问题真的是关于如何使用 Hector?
    【解决方案3】:

    试试这个:

    select columnfamily_name from system.schema_columnfamilies where keyspace_name=‘mykeyspace';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 2013-01-24
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      相关资源
      最近更新 更多