Apache Tajo - Câu lệnh SQL
Trong chương trước, bạn đã hiểu cách tạo bảng trong Tajo. Chương này giải thích về câu lệnh SQL trong Tajo.
Tạo Báo cáo Bảng
Trước khi chuyển sang tạo bảng, hãy tạo tệp văn bản “student.csv” trong đường dẫn thư mục cài đặt Tajo như sau:
students.csv
Tôi | Tên | Địa chỉ | Tuổi tác | Điểm |
---|---|---|---|---|
1 | Adam | 23 Phố Mới | 21 | 90 |
2 | Amit | 12 Phố Cổ | 13 | 95 |
3 | Bob | 10 Cross Street | 12 | 80 |
4 | David | 15 Đại lộ Express | 12 | 85 |
5 | Esha | 20 Garden Street | 13 | 50 |
6 | Ganga | 25 North Street | 12 | 55 |
7 | Jack | 2 Park Street | 12 | 60 |
8 | Leena | 24 đường phía nam | 12 | 70 |
9 | Mary | 5 phố tây | 12 | 75 |
10 | Peter | 16 Đại lộ Park | 12 | 95 |
Sau khi tệp đã được tạo, di chuyển đến thiết bị đầu cuối và khởi động máy chủ Tajo và trình bao từng cái một.
Tạo nên cơ sở dữ liệu
Tạo cơ sở dữ liệu mới bằng lệnh sau:
Truy vấn
default> create database sampledb;
OK
Kết nối với cơ sở dữ liệu “sa Sampleb” hiện đã được tạo.
default> \c sampledb
You are now connected to database "sampledb" as user “user1”.
Sau đó, tạo một bảng trong “sa Sampleb” như sau:
Truy vấn
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’;
Kết quả
Truy vấn trên sẽ tạo ra kết quả sau.
OK
Tại đây, bảng bên ngoài được tạo. Bây giờ, bạn chỉ cần nhập vị trí tệp. Nếu bạn phải gán bảng từ hdfs thì hãy sử dụng hdfs thay vì tệp.
Tiếp theo, “students.csv”tệp chứa các giá trị được phân tách bằng dấu phẩy. Cáctext.delimiter trường được gán với ','.
Bây giờ bạn đã tạo thành công “mytable” trong “sackedb”.
Hiển thị bảng
Để hiển thị các bảng trong Tajo, hãy sử dụng truy vấn sau.
Truy vấn
sampledb> \d
mytable
sampledb> \d mytable
Kết quả
Truy vấn trên sẽ tạo ra kết quả sau.
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
Bảng liệt kê
Để tìm nạp tất cả các bản ghi trong bảng, hãy nhập truy vấn sau:
Truy vấn
sampledb> select * from mytable;
Kết quả
Truy vấn trên sẽ tạo ra kết quả sau.
Chèn tuyên bố bảng
Tajo sử dụng cú pháp sau để chèn các bản ghi trong bảng.
Cú pháp
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;
Câu lệnh chèn của Tajo tương tự như câu lệnh INSERT INTO SELECT câu lệnh của SQL.
Truy vấn
Hãy tạo một bảng để ghi đè dữ liệu bảng của một bảng hiện có.
sampledb> create table test(sno int,name text,addr text,age int,mark int);
OK
sampledb> \d
Kết quả
Truy vấn trên sẽ tạo ra kết quả sau.
mytable
test
Chèn hồ sơ
Để chèn các bản ghi trong bảng "kiểm tra", hãy nhập truy vấn sau.
Truy vấn
sampledb> insert overwrite into test select * from mytable;
Kết quả
Truy vấn trên sẽ tạo ra kết quả sau.
Progress: 100%, response time: 0.518 sec
Tại đây, các bản ghi “mytable” ghi đè lên bảng “test”. Nếu bạn không muốn tạo bảng “test”, hãy chỉ định ngay vị trí đường dẫn thực như đã đề cập trong một tùy chọn thay thế cho truy vấn chèn.
Tìm nạp hồ sơ
Sử dụng truy vấn sau để liệt kê tất cả các bản ghi trong bảng "kiểm tra" -
Truy vấn
sampledb> select * from test;
Kết quả
Truy vấn trên sẽ tạo ra kết quả sau.
Câu lệnh này được sử dụng để thêm, xóa hoặc sửa đổi các cột của một bảng hiện có.
Để đổi tên bảng, hãy sử dụng cú pháp sau:
Alter table table1 RENAME TO table2;
Truy vấn
sampledb> alter table test rename to students;
Kết quả
Truy vấn trên sẽ tạo ra kết quả sau.
OK
Để kiểm tra tên bảng đã thay đổi, hãy sử dụng truy vấn sau.
sampledb> \d
mytable
students
Bây giờ bảng “kiểm tra” được đổi thành bảng “học sinh”.
Thêm cột
Để chèn cột mới trong bảng "sinh viên", hãy nhập cú pháp sau:
Alter table <table_name> ADD COLUMN <column_name> <data_type>
Truy vấn
sampledb> alter table students add column grade text;
Kết quả
Truy vấn trên sẽ tạo ra kết quả sau.
OK
Đặt thuộc tính
Thuộc tính này được sử dụng để thay đổi thuộc tính của bảng.
Truy vấn
sampledb> ALTER TABLE students SET PROPERTY 'compression.type' = 'RECORD',
'compression.codec' = 'org.apache.hadoop.io.compress.Snappy Codec' ;
OK
Ở đây, loại nén và thuộc tính codec được gán.
Để thay đổi thuộc tính dấu phân cách văn bản, hãy sử dụng như sau:
Truy vấn
ALTER TABLE students SET PROPERTY ‘text.delimiter'=',';
OK
Kết quả
Truy vấn trên sẽ tạo ra kết quả sau.
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
Kết quả trên cho thấy các thuộc tính của bảng được thay đổi bằng thuộc tính “SET”.
Chọn câu lệnh
Câu lệnh SELECT được sử dụng để chọn dữ liệu từ cơ sở dữ liệu.
Cú pháp cho câu lệnh Select như sau:
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)] [, …]]
Mệnh đề Where
Mệnh đề Where được sử dụng để lọc các bản ghi khỏi bảng.
Truy vấn
sampledb> select * from mytable where id > 5;
Kết quả
Truy vấn trên sẽ tạo ra kết quả sau.
Truy vấn trả về bản ghi của những sinh viên có id lớn hơn 5.
Truy vấn
sampledb> select * from mytable where name = ‘Peter’;
Kết quả
Truy vấn trên sẽ tạo ra kết quả sau.
Progress: 100%, response time: 0.117 sec
id, name, address, age
-------------------------------
10, Peter, 16 park avenue , 12
Kết quả chỉ lọc hồ sơ của Peter.
Mệnh đề riêng biệt
Một cột trong bảng có thể chứa các giá trị trùng lặp. Từ khóa DISTINCT chỉ có thể được sử dụng để trả về các giá trị riêng biệt (khác nhau).
Cú pháp
SELECT DISTINCT column1,column2 FROM table_name;
Truy vấn
sampledb> select distinct age from mytable;
Kết quả
Truy vấn trên sẽ tạo ra kết quả sau.
Progress: 100%, response time: 0.216 sec
age
-------------------------------
13
12
Truy vấn trả về độ tuổi khác biệt của sinh viên từ mytable.
Nhóm theo mệnh đề
Mệnh đề GROUP BY được sử dụng phối hợp với câu lệnh SELECT để sắp xếp dữ liệu giống nhau thành các nhóm.
Cú pháp
SELECT column1, column2 FROM table_name WHERE [ conditions ] GROUP BY column1, column2;
Truy vấn
select age,sum(mark) as sumofmarks from mytable group by age;
Kết quả
Truy vấn trên sẽ tạo ra kết quả sau.
age, sumofmarks
-------------------------------
13, 145
12, 610
Ở đây, cột “mytable” có hai loại tuổi - 12 và 13. Bây giờ truy vấn nhóm các bản ghi theo độ tuổi và tạo ra tổng điểm cho các độ tuổi tương ứng của học sinh.
Có mệnh đề
Mệnh đề HAVING cho phép bạn chỉ định các điều kiện lọc kết quả nhóm nào xuất hiện trong kết quả cuối cùng. Mệnh đề WHERE đặt điều kiện vào các cột đã chọn, trong khi mệnh đề HAVING đặt điều kiện vào các nhóm được tạo bởi mệnh đề GROUP BY.
Cú pháp
SELECT column1, column2 FROM table1 GROUP BY column HAVING [ conditions ]
Truy vấn
sampledb> select age from mytable group by age having sum(mark) > 200;
Kết quả
Truy vấn trên sẽ tạo ra kết quả sau.
age
-------------------------------
12
Truy vấn nhóm các bản ghi theo độ tuổi và trả về độ tuổi khi kết quả điều kiện sum (dấu)> 200.
Đặt hàng theo mệnh đề
Mệnh đề ORDER BY được sử dụng để sắp xếp dữ liệu theo thứ tự tăng dần hoặc giảm dần, dựa trên một hoặc nhiều cột. Cơ sở dữ liệu Tajo sắp xếp các kết quả truy vấn theo thứ tự tăng dần theo mặc định.
Cú pháp
SELECT column-list FROM table_name
[WHERE condition]
[ORDER BY column1, column2, .. columnN] [ASC | DESC];
Truy vấn
sampledb> select * from mytable where mark > 60 order by name desc;
Kết quả
Truy vấn trên sẽ tạo ra kết quả sau.
Truy vấn trả về tên của những sinh viên đó theo thứ tự giảm dần có điểm lớn hơn 60.
Tạo Tuyên bố Chỉ mục
Câu lệnh CREATE INDEX được sử dụng để tạo chỉ mục trong bảng. Chỉ mục được sử dụng để truy xuất dữ liệu nhanh chóng. Phiên bản hiện tại chỉ hỗ trợ lập chỉ mục cho các định dạng TEXT thuần túy được lưu trữ trên HDFS.
Cú pháp
CREATE INDEX [ name ] ON table_name ( { column_name | ( expression ) }
Truy vấn
create index student_index on mytable(id);
Kết quả
Truy vấn trên sẽ tạo ra kết quả sau.
id
———————————————
Để xem chỉ mục được chỉ định cho cột, hãy nhập truy vấn sau.
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 )
Ở đây, phương pháp TWO_LEVEL_BIN_TREE được sử dụng theo mặc định trong Tajo.
Tuyên bố bảng thả
Câu lệnh Drop Table được sử dụng để loại bỏ một bảng từ cơ sở dữ liệu.
Cú pháp
drop table table name;
Truy vấn
sampledb> drop table mytable;
Để kiểm tra xem bảng có bị xóa khỏi bảng hay không, hãy nhập truy vấn sau.
sampledb> \d mytable;
Kết quả
Truy vấn trên sẽ tạo ra kết quả sau.
ERROR: relation 'mytable' does not exist
Bạn cũng có thể kiểm tra truy vấn bằng lệnh “\ d” để liệt kê các bảng Tajo có sẵn.