Apache Tajo SQL 语句


在上一章中,你已经了解了如何在 Tajo 中创建表。本章介绍 Tajo 中的 SQL 语句。

创建表语句


动创建表前,在Tajo安装目录路径下创建一个文本文件“students.csv”如下:

学生.csv

Id Name Address Age Marks
1 Adam 新街 23 号 21 90
2 Amit 老街 12 号 13 95
3 Bob 十字街 10 号 12 80
4 David 快速大道 15 号 12 85
5 Esha 花园街 20 号 13 50
6 Ganga 北街 25 号 12 55
7 Jack 2公园街 12 60
8 Leena 南街 24 号 12 70
9 Mary 西街 5 号 12 75
10 Peter 公园大道 16 号 12 95

文件创建完成后,移动到终端,一一启动 Tajo 服务器和 shell。

创建数据库


使用以下命令创建一个新数据库:

Query

default> create database sampledb; 
OK

连接到现在创建的数据库“sampledb”。

default> \c sampledb 
You are now connected to database "sampledb" as user “user1”.

然后,在“sampledb”中创建一个表,如下:

Query

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’;

Result

上述查询将生成以下结果。

OK

在这里,创建了外部表。现在,你只需输入文件位置。如果你必须从 hdfs 分配表,则使用 hdfs 而不是文件。

接下来, “学生.csv” 文件包含逗号分隔值。这 文本分隔符 字段分配有“,”。

你现在已经在“sampledb”中成功创建了“mytable”。

显示表


要在 Tajo 中显示表,请使用以下查询。

Query

sampledb> \d  
mytable  
sampledb> \d mytable

Result

上述查询将生成以下结果。

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 

列表表


要获取表中的所有记录,请键入以下查询:

Query

sampledb> select * from mytable;

Result

上述查询将生成以下结果。

List Table

插入表语句


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 的插入语句类似于 插入选择 SQL 语句。

Query

让我们创建一个表来覆盖现有表的表数据。

sampledb> create table test(sno int,name text,addr text,age int,mark int);  
OK 
sampledb> \d

Result

上述查询将生成以下结果。

mytable 
test

插入记录


要在“test”表中插入记录,请键入以下查询。

Query

sampledb> insert overwrite into test select * from mytable; 

Result

上述查询将生成以下结果。

Progress: 100%, response time: 0.518 sec

在这里,“mytable”记录覆盖了“test”表。如果你不想创建“test”表,则直接分配物理路径位置,如插入查询的替代选项中所述。

获取记录


使用以下查询列出“test”表中的所有记录:

Query

sampledb> select * from test;

Result

上述查询将生成以下结果。

Fetch Records

此语句用于添加、删除或修改现有表的列。

要重命名表,请使用以下语法:

Alter table table1 RENAME TO table2;

Query

sampledb> alter table test rename to students;

Result

上述查询将生成以下结果。

OK

要检查更改的表名,请使用以下查询。

sampledb> \d  
mytable 
students

现在表“test”更改为“students”表。

添加列


要在“students”表中插入新列,请输入以下语法:

Alter table <table_name> ADD COLUMN <column_name> <data_type>

Query

sampledb> alter table students add column grade text; 

Result

上述查询将生成以下结果。

OK

设置属性


此属性用于更改表的属性。

Query

sampledb> ALTER TABLE students SET PROPERTY 'compression.type' = 'RECORD',
    'compression.codec' = 'org.apache.hadoop.io.compress.Snappy Codec' ;
OK

在这里,分配了压缩类型和编解码器属性。

要更改文本分隔符属性,请使用以下命令:

Query

ALTER TABLE students  SET PROPERTY ‘text.delimiter'=',';  
OK 

Result

上述查询将生成以下结果。

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 子句用于过滤表中的记录。

Query

sampledb> select * from mytable where id > 5;

Result

上述查询将生成以下结果。

Where Clause

查询返回 id 大于 5 的学生的记录。

Query

sampledb> select * from mytable where name = ‘Peter’; 

Result

上述查询将生成以下结果。

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;

Query

sampledb> select distinct age from mytable; 

Result

上述查询将生成以下结果。

Progress: 100%, response time: 0.216 sec  
age 
------------------------------- 
13 
12 

查询返回学生的不同年龄 mytable .

按条款分组


GROUP BY 子句与 SELECT 语句配合使用,将相同的数据排列成组。

语法

SELECT column1, column2 FROM table_name WHERE [ conditions ] GROUP BY column1, column2;

Query

select age,sum(mark) as sumofmarks from mytable group by age;

Result

上述查询将生成以下结果。

age,  sumofmarks 
------------------------------- 
13,  145 
12,  610

这里,“mytable”列有两种年龄——12 岁和 13 岁。现在查询按年龄对记录进行分组,并生成相应年龄学生的分数总和。

有子句


HAVING 子句使你能够指定过滤哪些组结果出现在最终结果中的条件。 WHERE 子句将条件放在选定的列上,而 HAVING 子句将条件放在由 GROUP BY 子句创建的组上。

语法

SELECT column1, column2 FROM table1 GROUP BY column HAVING [ conditions ]

Query

sampledb> select age from mytable group by age  having  sum(mark) > 200; 

Result

上述查询将生成以下结果。

age 
------------------------------- 
12 

查询按年龄对记录进行分组,当条件结果 sum(mark) > 200 时返回年龄。

按条款排序


ORDER BY 子句用于根据一列或多列按升序或降序对数据进行排序。 Tajo 数据库默认按升序对查询结果进行排序。

语法

SELECT column-list FROM table_name  
[WHERE condition]  
[ORDER BY column1, column2, .. columnN] [ASC | DESC]; 

Query

sampledb> select * from mytable where mark > 60 order by name desc; 

Result

上述查询将生成以下结果。

Order by Clause

查询按降序返回分数大于 60 的学生的姓名。

创建索引语句


CREATE INDEX 语句用于在表中创建索引。索引用于快速检索数据。当前版本仅支持存储在 HDFS 上的纯文本格式的索引。

语法

CREATE INDEX [ name ] ON table_name ( { column_name | ( expression ) }

Query

create index student_index on mytable(id);

Result

上述查询将生成以下结果。

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 语句用于从数据库中删除表。

语法

drop table table name;

Query

sampledb> drop table mytable;

要检查表是否已从表中删除,请键入以下查询。

sampledb> \d mytable;

Result

上述查询将生成以下结果。

ERROR: relation 'mytable' does not exist 

你还可以使用“\d”命令检查查询以列出可用的 Tajo 表。