Чтобы получить информацию, специфичную для столбца, сначала вам нужно будет выполнить итерацию по определениям семейства столбцов в определении Keyspace и сопоставить семейство столбцов по имени - можно использовать Thrift API, но я бы предложил использовать Hector.
С помощью определения семейства столбцов выполните итерацию метаданных столбца и найдите соответствие для нужного столбца. Затем обратитесь к соответствующему определению столбца, чтобы получить класс проверки. Если метаданные отсутствуют или соответствующий столбец отсутствует, класс проверки будет классом проверки по умолчанию в определении семейства столбцов.
Используя 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());
}
}
}
}
Если вы запустите это, вы заметите, что любой класс проверки будет принадлежать пакету org.apache.cassandra.db.marshal, и каждый тип является производным от AbstractType.
Когда у вас есть Тип, вы можете принимать решения по вашим данным. Например, если вы пишете инструмент для создания дампа данных, вам может потребоваться получить строковое представление каждого столбца, и вы можете использовать AbstractType для получения строкового представления значения, используя TypeParser для создания типа.
например. не-Гектор метод, который я использовал для этого, выглядит как
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;
}
Вы можете использовать этот метод для вывода ключей и имен столбцов; эти имена типов также включены в определение семейства столбцов.
Один быстрый ярлык, если вы знаете, что значение столбца является строкой, поскольку в байтовом буфере нет метода getString, вы должны использовать java.nio.charset.Charset:
Charset.defaultCharset().decode(col.getValue()).toString()