Din*_*108 2 java cassandra cassandra-0.7
我正在使用Java连接到Cassandra.我想做一些事情,比如检查列的数据类型即; 是长还是UTF-8因为,如果它很长,那么我可以得到column.value.getLong()的值,但如果它是UTF-8或其他,我必须将ByteBuffer转换为String.有人可以帮助我如何找到列的类型?
要获取列特定信息,首先必须遍历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)
| 归档时间: |
|
| 查看次数: |
3631 次 |
| 最近记录: |