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テーブルを一覧表示することもできます。