Cassandra-read-data
Cassandra-データの読み取り
Select句を使用したデータの読み取り
SELECT句は、Cassandraのテーブルからデータを読み取るために使用されます。 この句を使用すると、テーブル全体、単一の列、または特定のセルを読み取ることができます。 SELECT句の構文は次のとおりです。
SELECT FROM <tablename>
例
次の詳細を持つ emp という名前のキースペースにテーブルがあると仮定します-
emp_id | emp_name | emp_city | emp_phone | emp_sal |
---|---|---|---|---|
1 | ram | Hyderabad | 9848022338 | 50000 |
2 | robin | null | 9848022339 | 50000 |
3 | rahman | Chennai | 9848022330 | 50000 |
4 | rajeev | Pune | 9848022331 | 30000 |
次の例は、SELECT句を使用してテーブル全体を読み取る方法を示しています。 ここでは、 emp というテーブルを読み込んでいます。
cqlsh:finddevguides> select * from emp;
emp_id | emp_city | emp_name | emp_phone | emp_sal
--------+-----------+----------+------------+---------
1 | Hyderabad | ram | 9848022338 | 50000
2 | null | robin | 9848022339 | 50000
3 | Chennai | rahman | 9848022330 | 50000
4 | Pune | rajeev | 9848022331 | 30000
(4 rows)
必要な列の読み取り
次の例は、テーブル内の特定の列を読み取る方法を示しています。
cqlsh:finddevguides> SELECT emp_name, emp_sal from emp;
emp_name | emp_sal
----------+---------
ram | 50000
robin | 50000
rajeev | 30000
rahman | 50000
(4 rows)
Where句
WHERE句を使用して、必要な列に制約を設定できます。 その構文は次のとおりです-
SELECT FROM <table name> WHERE <condition>;
注-WHERE句は、主キーの一部である列、またはそれらにセカンダリインデックスがある列でのみ使用できます。
次の例では、給与が50000の従業員の詳細を読み取ります。 まず、セカンダリインデックスを列emp_salに設定します。
cqlsh:finddevguides> CREATE INDEX ON emp(emp_sal);
cqlsh:finddevguides> SELECT * FROM emp WHERE emp_sal=50000;
emp_id | emp_city | emp_name | emp_phone | emp_sal
--------+-----------+----------+------------+---------
1 | Hyderabad | ram | 9848022338 | 50000
2 | null | robin | 9848022339 | 50000
3 | Chennai | rahman | 9848022330 | 50000
Java APIを使用したデータの読み取り
Sessionクラスのexecute()メソッドを使用して、テーブルからデータを読み取ることができます。 Java APIの助けを借りて、バッチステートメントを使用して複数のステートメントを実行するには、以下の手順に従います。
ステップ1:クラスターオブジェクトを作成する
以下に示すように、 com.datastax.driver.core パッケージの Cluster.builder クラスのインスタンスを作成します。
//Creating Cluster.Builder object
Cluster.Builder builder1 = Cluster.builder();
*Cluster.Builder* オブジェクトの* addContactPoint()*メソッドを使用して、接点(ノードのIPアドレス)を追加します。 このメソッドは *Cluster.Builder* を返します。
//Adding contact point to the Cluster.Builder object
Cluster.Builder builder2 = build.addContactPoint( "127.0.0.1" );
新しいビルダーオブジェクトを使用して、クラスターオブジェクトを作成します。 そのためには、 Cluster.Builder クラスに* build()*というメソッドがあります。 次のコードを使用して、クラスターオブジェクトを作成します。
//Building a cluster
Cluster cluster = builder.build();
以下に示すように、1行のコードを使用してクラスターオブジェクトを構築できます。
Cluster cluster = Cluster.builder().addContactPoint("127.0.0.1").build();
ステップ2:セッションオブジェクトを作成する
以下に示すように、Clusterクラスのconnect()メソッドを使用してSessionオブジェクトのインスタンスを作成します。
Session session = cluster.connect( );
このメソッドは、新しいセッションを作成して初期化します。 キースペースがすでにある場合は、次に示すように、キースペース名を文字列形式でこのメソッドに渡すことで、既存のキースペースに設定できます。
Session session = cluster.connect(“Your keyspace name”);
ここでは、 tp というキースペースを使用しています。 したがって、次のようにセッションオブジェクトを作成します。
Session session = cluster.connect(“tp”);
ステップ3:クエリを実行する
Sessionクラスのexecute()メソッドを使用してCQLクエリを実行できます。 クエリを文字列形式で、またはStatementクラスオブジェクトとしてexecute()メソッドに渡します。 このメソッドに文字列形式で渡すものはすべて、 cqlsh で実行されます。
この例では、 emp テーブルからデータを取得しています。 以下に示すように、クエリを文字列に保存し、セッションクラスのexecute()メソッドに渡します。
String query = ”SELECT 8 FROM emp”;
session.execute(query);
Sessionクラスのexecute()メソッドを使用してクエリを実行します。
ステップ4:ResultSetオブジェクトを取得する
選択クエリは結果を ResultSet オブジェクトの形式で返すため、以下に示すように結果を RESULTSET クラスのオブジェクトに保存します。
ResultSet result = session.execute( );
以下は、テーブルからデータを読み取るための完全なプログラムです。
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Session;
public class Read_Data {
public static void main(String args[])throws Exception{
//queries
String query = "SELECT * FROM emp";
//Creating Cluster object
Cluster cluster = Cluster.builder().addContactPoint("127.0.0.1").build();
//Creating Session object
Session session = cluster.connect("finddevguides");
//Getting the ResultSet
ResultSet result = session.execute(query);
System.out.println(result.all());
}
}
クラス名の後に.javaを付けて上記のプログラムを保存し、保存されている場所を参照します。 以下に示すように、プログラムをコンパイルして実行します。
$javac Read_Data.java
$java Read_Data
通常の状態では、次の出力を生成する必要があります-
[Row[1, Hyderabad, ram, 9848022338, 50000], Row[2, Delhi, robin,
9848022339, 50000], Row[4, Pune, rajeev, 9848022331, 30000], Row[3,
Chennai, rahman, 9848022330, 50000]]