- Apache Tajo 教程
- Apache Tajo - 主页
- Apache Tajo - 简介
- Apache Tajo - 架构
- Apache Tajo - 安装
- Apache Tajo - 配置设置
- Apache Tajo - Shell 命令
- Apache Tajo - 数据类型
- Apache Tajo - 操作员
- Apache Tajo - SQL 函数
- Apache Tajo - 数学函数
- Apache Tajo - 字符串函数
- Apache Tajo - 日期时间函数
- Apache Tajo - JSON 函数
- Apache Tajo - 数据库创建
- Apache Tajo - 表管理
- Apache Tajo - SQL 语句
- 聚合和窗口函数
- Apache Tajo - SQL 查询
- Apache Tajo - 存储插件
- 与 HBase 集成
- Apache Tajo - 与 Hive 集成
- OpenStack Swift 集成
- Apache Tajo - JDBC 接口
- Apache Tajo - 自定义函数
- Apache Tajo 有用资源
- Apache Tajo - 快速指南
- Apache Tajo - 有用的资源
- Apache Tajo - 讨论
Apache Tajo - SQL 语句
在上一章中,您已经了解了如何在 Tajo 中创建表。本章介绍 Tajo 中的 SQL 语句。
创建表语句
在创建表之前,请在 Tajo 安装目录路径中创建一个文本文件“students.csv”,如下所示 -
学生.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 服务器和 shell。
创建数据库
使用以下命令创建一个新数据库 -
询问
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语句类似于SQL的INSERT INTO SELECT语句。
询问
让我们创建一个表来覆盖现有表的表数据。
sampledb> create table test(sno int,name text,addr text,age int,mark int); OK sampledb> \d
结果
上述查询将生成以下结果。
mytable test
插入记录
要在“test”表中插入记录,请键入以下查询。
询问
sampledb> insert overwrite into test select * from mytable;
结果
上述查询将生成以下结果。
Progress: 100%, response time: 0.518 sec
这里,“mytable”记录覆盖“test”表。如果您不想创建“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 子句用于过滤表中的记录。
询问
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返回学生的不同年龄。
分组依据子句
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。现在查询按年龄对记录进行分组,并生成学生相应年龄的分数总和。
拥有子句
HAVING 子句使您能够指定过滤哪些组结果出现在最终结果中的条件。WHERE 子句将条件置于所选列上,而 HAVING 子句则将条件置于由 GROUP BY 子句创建的组上。
句法
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 子句用于根据一列或多列按升序或降序对数据进行排序。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 语句用于从数据库中删除表。
句法
drop table table name;
询问
sampledb> drop table mytable;
要检查该表是否已从表中删除,请键入以下查询。
sampledb> \d mytable;
结果
上述查询将生成以下结果。
ERROR: relation 'mytable' does not exist
您还可以使用“\d”命令检查查询以列出可用的 Tajo 表。