如何获取列值的类型

Din*_*108 2 java cassandra cassandra-0.7

我正在使用Java连接到Cassandra.我想做一些事情,比如检查列的数据类型即; 是长还是UTF-8因为,如果它很长,那么我可以得到column.value.getLong()的值,但如果它是UTF-8或其他,我必须将ByteBuffer转换为String.有人可以帮助我如何找到列的类型?

lib*_*ack 5

要获取列特定信息,首先必须遍历Keyspace定义中的列族定义并按名称匹配列族 - 可以使用thrift API,但我建议使用Hector.

使用"列族"定义,遍历列元数据,并找到所需列的匹配项.然后参考匹配的Column Definition,获取验证类.如果没有元数据或没有匹配列,则验证类将成为列族定义中的默认验证类.

使用Hector API,以下内容将列出键空间中的所有列族,并完成作为参数传递的CF名称的详细信息.

public static void main(String[] args) {
    String hostPort = "localhost:9160";
    String cfname = null;

    if (args.length < 1)
    {
        System.out.println("Expecting <CF>  as arguments");
        System.exit(1);
    }
    cfname = args[0];

    Cluster cluster = HFactory.getOrCreateCluster( "myCluster", hostPort );
    KeyspaceDefinition ksdef = cluster.describeKeyspace("myKeyspace");

    for (ColumnFamilyDefinition cfdef: ksdef.getCfDefs()) {
        System.out.println(cfdef.getName());
        if (cfdef.getName().equals(cfname)) {
            System.out.println("Comment: " + cfdef.getComment());
            System.out.println("Key: " + cfdef.getKeyValidationClass());
            System.out.println("Comparator: " + cfdef.getComparatorType().getTypeName());
            System.out.println("Default Validation:" + cfdef.getDefaultValidationClass());
            System.out.println("Column MetaData:");
            for (ColumnDefinition cdef: cfdef.getColumnMetadata()) {
                System.out.println("  Column Name: " + Charset.defaultCharset().decode(cdef.getName()).toString());
                System.out.println("    Validation Class: " + cdef.getValidationClass());
                System.out.println("    Index Name: " + cdef.getIndexName());
                System.out.println("    Index Type: " + cdef.getIndexType().toString());
            }
        }
    }


}
Run Code Online (Sandbox Code Playgroud)

如果运行它,您会注意到任何验证类都属于org.apache.cassandra.db.marshal包,每个类型都派生自AbstractType.

获得类型后,您就可以对数据做出决策.例如,如果编写数据转储器工具,您可能只想获取每列的字符串表示形式,并且可以使用AbstractType来获取值的字符串表示形式,使用TypeParser创建类型.

例如,我曾经这样做的非Hector方法看起来像

private String getAsString(java.nio.ByteBuffer bytes, String marshalType) {

    String val = null;
    try {
        AbstractType abstractType = TypeParser.parse(marshalType);
        val = abstractType.getString(bytes);
    } catch (ConfigurationException e) {
        e.printStackTrace();
    }

    return val;
}
Run Code Online (Sandbox Code Playgroud)

您可以使用此方法转储键和列名称; 这些类型名称也在列族定义中.

一个快速的快捷方式,如果您知道列值是一个字符串,因为字节缓冲区上没有getString方法,您必须使用java.nio.charset.Charset:

Charset.defaultCharset().decode(col.getValue()).toString()
Run Code Online (Sandbox Code Playgroud)