2011-10-11 5 views
9

私はcassandraとhectorを初めて使用しているので、cqlクエリを実行しようとしていますが、私は "select * from users"というクエリを実行しますか?cqlクエリを使用してJavaクライアントhectorで異なるデータ型を取得する方法

私のコラムの家族は次のようになります。私は、クエリを実行するには、次のコードを使用し

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」列のバリデーションクラスロング私ができます」値を取得します。それが動作たより

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

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

:私はこれに私のクエリを変更した場合

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

: は、私は1つのレコードのみがあると仮定し、以下の結果が得られます。

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

答えて

11

CqlRowsでは値の型をStringとして指定するため、すべての値は文字列であることが想定されています。その後

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

、処理するとき:[値の種類をミックスしたい、あなたは、列のメタデータを維持するだけでなく、スキーマにBytesTypeとして、デフォルトのバリデーションクラスを指定してCqlRowsに型としてのByteBufferを使用する必要がありますので、値は、あなたが適切な型に変換する必要がありますし、代わりに列を反復処理を、あなたはおそらく名前で特定の列を取得します:もちろん

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:

タイプはColumnメタデータから決めることができますが、これはThrift API(ColumnDefを参照)でのみ行っているため、Hector APIを使用して行う方法はわかりません。しかし、HColumnはgetValueSerializer()メソッドを提供しています。したがって、これは開始になる可能性があります。

+0

こんにちはlibjack、あなたの反応に感謝します。 列ファミリのすべての列がデフォルトの検証クラスとしてbyteBufferを持つ場合にのみ可能であることを意味しますか?これは、私が欲しいものではありません。なぜなら、データをcassandraに挿入するとき、有効なデータのチェックは機能していないからです。 birth_yearという列に文字列を挿入することは可能です。 私はあなたのコードを試していますが、メソッド 'getLong()'は認識されません。 – Rubenski

+0

私は間違ったwhithを見つけました: "col.getValue()。getLong()" "column.getValueBytes()。getLong()"にする必要があります 私の前の質問は解決しました。列ファミリに複数のvalidation_classeを含めることは可能です。 – Rubenski

+0

Right、getLong()はByteBufferのメソッドなので、getValue()はByteBufferがHColumnに指定された型である場合にのみ返します。 – libjack

関連する問題