ApacheTajo-SQLステートメント
前の章では、Tajoでテーブルを作成する方法を理解しました。この章では、TajoのSQLステートメントについて説明します。
テーブルステートメントの作成
テーブルの作成に移動する前に、次のようにTajoインストールディレクトリパスにテキストファイル「students.csv」を作成します。
students.csv
Id | 名前 | 住所 | 年齢 | マーク |
---|---|---|---|---|
1 | アダム | 23ニューストリート | 21 | 90 |
2 | アミット | 12オールドストリート | 13 | 95 |
3 | ボブ | 10クロスストリート | 12 | 80 |
4 | デビッド | 15エクスプレスアベニュー | 12 | 85 |
5 | エシャ | 20ガーデンストリート | 13 | 50 |
6 | ガンジス川 | 25ノースストリート | 12 | 55 |
7 | ジャック | 2パークストリート | 12 | 60 |
8 | リーナ | 24サウスストリート | 12 | 70 |
9 | メアリー | 5ウェストストリート | 12 | 75 |
10 | ピーター | 16パークアベニュー | 12 | 95 |
ファイルが作成されたら、ターミナルに移動し、Tajoサーバーとシェルを1つずつ起動します。
データベースの作成
次のコマンドを使用して新しいデータベースを作成します-
クエリ
default> create database sampledb;
OK
これで作成されたデータベース「sampledb」に接続します。
default> \c sampledb
You are now connected to database "sampledb" as user “user1”.
次に、「sampledb」に次のようにテーブルを作成します-
クエリ
sampledb> create external table mytable(id int,name text,address text,age int,mark int)
using text with('text.delimiter' = ',') location ‘file:/Users/workspace/Tajo/students.csv’;
結果
上記のクエリは、次の結果を生成します。
OK
ここで、外部テーブルが作成されます。これで、ファイルの場所を入力するだけです。hdfsからテーブルを割り当てる必要がある場合は、ファイルの代わりにhdfsを使用してください。
次に、 “students.csv”ファイルにはコンマ区切りの値が含まれています。ザ・text.delimiter フィールドには「、」が割り当てられます。
これで、「sampledb」に「mytable」が正常に作成されました。
表を表示
Tajoでテーブルを表示するには、次のクエリを使用します。
クエリ
sampledb> \d
mytable
sampledb> \d mytable
結果
上記のクエリは、次の結果を生成します。
table name: sampledb.mytable
table uri: file:/Users/workspace/Tajo/students.csv
store type: TEXT
number of rows: unknown
volume: 261 B
Options:
'timezone' = 'Asia/Kolkata'
'text.null' = '\\N'
'text.delimiter' = ','
schema:
id INT4
name TEXT
address TEXT
age INT4
mark INT4
リストテーブル
テーブル内のすべてのレコードをフェッチするには、次のクエリを入力します-
クエリ
sampledb> select * from mytable;
結果
上記のクエリは、次の結果を生成します。
テーブルステートメントの挿入
Tajoは、次の構文を使用してテーブルにレコードを挿入します。
構文
create table table1 (col1 int8, col2 text, col3 text);
--schema should be same for target table schema
Insert overwrite into table1 select * from table2;
(or)
Insert overwrite into LOCATION '/dir/subdir' select * from table;
Tajoの挿入ステートメントは、 INSERT INTO SELECT SQLのステートメント。
クエリ
既存のテーブルのテーブルデータを上書きするテーブルを作成しましょう。
sampledb> create table test(sno int,name text,addr text,age int,mark int);
OK
sampledb> \d
結果
上記のクエリは、次の結果を生成します。
mytable
test
レコードを挿入
「テスト」テーブルにレコードを挿入するには、次のクエリを入力します。
クエリ
sampledb> insert overwrite into test select * from mytable;
結果
上記のクエリは、次の結果を生成します。
Progress: 100%, response time: 0.518 sec
ここで、「mytable」レコードは「test」テーブルを上書きします。「test」テーブルを作成したくない場合は、挿入クエリの代替オプションで説明されているように、すぐに物理パスの場所を割り当てます。
レコードを取得する
次のクエリを使用して、「テスト」テーブルのすべてのレコードを一覧表示します-
クエリ
sampledb> select * from test;
結果
上記のクエリは、次の結果を生成します。
このステートメントは、既存のテーブルの列を追加、削除、または変更するために使用されます。
テーブルの名前を変更するには、次の構文を使用します-
Alter table table1 RENAME TO table2;
クエリ
sampledb> alter table test rename to students;
結果
上記のクエリは、次の結果を生成します。
OK
変更されたテーブル名を確認するには、次のクエリを使用します。
sampledb> \d
mytable
students
これで、テーブル「test」が「students」テーブルに変更されました。
列を追加
「students」テーブルに新しい列を挿入するには、次の構文を入力します-
Alter table <table_name> ADD COLUMN <column_name> <data_type>
クエリ
sampledb> alter table students add column grade text;
結果
上記のクエリは、次の結果を生成します。
OK
プロパティを設定する
このプロパティは、テーブルのプロパティを変更するために使用されます。
クエリ
sampledb> ALTER TABLE students SET PROPERTY 'compression.type' = 'RECORD',
'compression.codec' = 'org.apache.hadoop.io.compress.Snappy Codec' ;
OK
ここでは、圧縮タイプとコーデックのプロパティが割り当てられています。
テキスト区切り文字のプロパティを変更するには、次を使用します-
クエリ
ALTER TABLE students SET PROPERTY ‘text.delimiter'=',';
OK
結果
上記のクエリは、次の結果を生成します。
sampledb> \d students
table name: sampledb.students
table uri: file:/tmp/tajo-user1/warehouse/sampledb/students
store type: TEXT
number of rows: 10
volume: 228 B
Options:
'compression.type' = 'RECORD'
'timezone' = 'Asia/Kolkata'
'text.null' = '\\N'
'compression.codec' = 'org.apache.hadoop.io.compress.SnappyCodec'
'text.delimiter' = ','
schema:
id INT4
name TEXT
addr TEXT
age INT4
mark INT4
grade TEXT
上記の結果は、「SET」プロパティを使用してテーブルのプロパティが変更されていることを示しています。
ステートメントを選択
SELECTステートメントは、データベースからデータを選択するために使用されます。
Selectステートメントの構文は次のとおりです-
SELECT [distinct [all]] * | <expression> [[AS] <alias>] [, ...]
[FROM <table reference> [[AS] <table alias name>] [, ...]]
[WHERE <condition>]
[GROUP BY <expression> [, ...]]
[HAVING <condition>]
[ORDER BY <expression> [ASC|DESC] [NULLS (FIRST|LAST)] [, …]]
Where句
Where句は、テーブルからレコードをフィルタリングするために使用されます。
クエリ
sampledb> select * from mytable where id > 5;
結果
上記のクエリは、次の結果を生成します。
クエリは、idが5より大きい学生のレコードを返します。
クエリ
sampledb> select * from mytable where name = ‘Peter’;
結果
上記のクエリは、次の結果を生成します。
Progress: 100%, response time: 0.117 sec
id, name, address, age
-------------------------------
10, Peter, 16 park avenue , 12
結果は、Peterのレコードのみをフィルタリングします。
明確な条項
テーブルの列に重複する値が含まれている可能性があります。DISTINCTキーワードは、別個の(異なる)値のみを返すために使用できます。
構文
SELECT DISTINCT column1,column2 FROM table_name;
クエリ
sampledb> select distinct age from mytable;
結果
上記のクエリは、次の結果を生成します。
Progress: 100%, response time: 0.216 sec
age
-------------------------------
13
12
クエリは、からの学生の明確な年齢を返します mytable。
GroupBy句
GROUP BY句は、SELECTステートメントと連携して使用され、同一のデータをグループに配置します。
構文
SELECT column1, column2 FROM table_name WHERE [ conditions ] GROUP BY column1, column2;
クエリ
select age,sum(mark) as sumofmarks from mytable group by age;
結果
上記のクエリは、次の結果を生成します。
age, sumofmarks
-------------------------------
13, 145
12, 610
ここで、「mytable」列には12と13の2種類の年齢があります。クエリはレコードを年齢別にグループ化し、対応する学生の年齢のマークの合計を生成します。
条項がある
HAVING句を使用すると、最終結果に表示されるグループ結果をフィルタリングする条件を指定できます。WHERE句は、選択した列に条件を設定しますが、HAVING句は、GROUPBY句によって作成されたグループに条件を設定します。
構文
SELECT column1, column2 FROM table1 GROUP BY column HAVING [ conditions ]
クエリ
sampledb> select age from mytable group by age having sum(mark) > 200;
結果
上記のクエリは、次の結果を生成します。
age
-------------------------------
12
クエリはレコードを年齢でグループ化し、条件の結果がsum(mark)> 200の場合の年齢を返します。
条項による注文
ORDER BY句は、1つ以上の列に基づいて、データを昇順または降順で並べ替えるために使用されます。Tajoデータベースは、デフォルトでクエリ結果を昇順で並べ替えます。
構文
SELECT column-list FROM table_name
[WHERE condition]
[ORDER BY column1, column2, .. columnN] [ASC | DESC];
クエリ
sampledb> select * from mytable where mark > 60 order by name desc;
結果
上記のクエリは、次の結果を生成します。
クエリは、マークが60より大きい学生の名前を降順で返します。
インデックスステートメントの作成
CREATE INDEXステートメントは、テーブルにインデックスを作成するために使用されます。インデックスは、データを高速に取得するために使用されます。現在のバージョンは、HDFSに保存されているプレーンテキスト形式のインデックスのみをサポートしています。
構文
CREATE INDEX [ name ] ON table_name ( { column_name | ( expression ) }
クエリ
create index student_index on mytable(id);
結果
上記のクエリは、次の結果を生成します。
id
———————————————
列に割り当てられたインデックスを表示するには、次のクエリを入力します。
default> \d mytable
table name: default.mytable
table uri: file:/Users/deiva/workspace/Tajo/students.csv
store type: TEXT
number of rows: unknown
volume: 307 B
Options:
'timezone' = 'Asia/Kolkata'
'text.null' = '\\N'
'text.delimiter' = ','
schema:
id INT4
name TEXT
address TEXT
age INT4
mark INT4
Indexes:
"student_index" TWO_LEVEL_BIN_TREE (id ASC NULLS LAST )
ここで、TajoではデフォルトでTWO_LEVEL_BIN_TREEメソッドが使用されます。
ドロップテーブルステートメント
ドロップテーブルステートメントは、データベースからテーブルをドロップするために使用されます。
構文
drop table table name;
クエリ
sampledb> drop table mytable;
テーブルがテーブルから削除されたかどうかを確認するには、次のクエリを入力します。
sampledb> \d mytable;
結果
上記のクエリは、次の結果を生成します。
ERROR: relation 'mytable' does not exist
「\ d」コマンドを使用してクエリをチェックし、使用可能なTajoテーブルを一覧表示することもできます。