9

私はcassandraとhectorを初めて使用するので、cqlクエリを実行しようとしていますが、問題は、すべての列が文字列型ではないということです。そのため、クエリ「select * from users」をどのように実行しますか?

私の列ファミリーは次のようになります。

UPDATE COLUMN FAMILY users
WITH comparator = UTF8Type
AND key_validation_class=UTF8Type
AND column_metadata = [
{column_name: full_name, validation_class: UTF8Type}
{column_name: email, validation_class: UTF8Type}
{column_name: state, validation_class: UTF8Type, index_type: KEYS}
{column_name: gender, validation_class: UTF8Type}
{column_name: birth_year, validation_class: LongType, index_type: KEYS}
{column_name: education, validation_class: UTF8Type}
];

次のコードを使用してクエリを実行します。

CqlQuery<String, String, String> cqlQuery = new CqlQuery<String, String, String>(Keyspace,stringSerializer,stringSerializer,stringSerializer);

    cqlQuery.setQuery("select * from users");

    QueryResult<CqlRows<String, String, String>> result = cqlQuery.execute();


    if (result != null && result.get() != null) {
        List<Row<String, String, String>> list = result.get().getList();
        for (Row row : list) {
            System.out.println(".");
            List columns = row.getColumnSlice().getColumns();
            for (Iterator iterator = columns.iterator(); iterator.hasNext();) {
                HColumn column = (HColumn) iterator.next();
                System.out.print(column.getName() + ":" + column.getValue()
                        + "\t");
            }
            System.out.println("");
        }
    }

しかし、検証クラスが長い「birth_year」列のため、値を取得できません。レコードが 1 つしかないと仮定すると、次の結果が得られます。

KEY:Carl birth_year: 'strange chars?' full_name:Carl Smith gender:M eduction:electrician state:LA

クエリを次のように変更すると:

CqlQuery<String, String, Long> cqlQuery =  new CqlQuery<String, String, Long>
TutorialBase.tutorialKeyspace, stringSerializer, stringSerializer, longSerializer);

    cqlQuery.setQuery("select birth_year from users");

それが機能するより。

では、1 つのクエリだけでこれを行うにはどうすればよいでしょうか。また、列ファミリーの行にブール値や浮動小数点数などのデータ型がさらにある場合はどうすればよいでしょうか。

4

1 に答える 1

11

CqlRowsで値の型をStringとして指定するため、すべての値は文字列であることが期待されます。値型を混在させたいので、列のメタデータを保持する必要がありますが、スキーマではデフォルトの検証クラスをBytesTypeとして指定し、CqlRowsでは型としてByteBufferを使用します。

QueryResult<CqlRows<String, String, ByteBuffer>> result = cqlQuery.execute();

次に、値を処理するときに、適切なタイプに変換する必要があります。列を反復処理する代わりに、名前で特定の列を取得する可能性があります。

ColumnSlice<String, ByteBuffer> slice = row.getColumnSlice();
HColumn<String,ByteBuffer> col = slice.getColumnByName("birth_year");
System.out.println(" birth_year: " + col.getValue().getLong());

もちろん、文字列はjava.nio.charset.Charsetを使用して別の方法で処理する必要があります。

Charset.defaultCharset().decode(col.getValue()).toString()

列のメタデータからタイプを判別できますが、これはThrift API(ColumnDefを参照)を介してのみ行ったため、HectorAPIを介して行う方法がわかりません。しかし、HColumnはgetValueSerializer()メソッドを提供しているので、それが出発点になる可能性があります。

于 2011-10-11T22:19:42.167 に答える