前言
Greenplum 的剩余部分主要其实主要就是 DDL 和之前学的 MySQL 不大一样,毕竟 Greenplum 是基于 PostgreSQL 数据库的,不过那些 DML 和 MySQL、Hive 基本上大差不差,所以就没有必要浪费时间了。
1、DDL
1.1、库操作
1.1.1、创建数据库
语法
CREATE DATABASE name
[ [ WITH ] [ OWNER [=] db_owner ] -- 指定数据库所有者
[ TEMPLATE [=] template ] -- 指定数据库模板(规范和约束),默认是 template1
[ ENCODING [=] encoding ] -- 指定当前数据库的编码
[ TABLESPACE [=] tablespace ] -- 表的命名空间(默认是 pg_default)
[CONNECTION LIMIT [=] connlimit ] -- 限制当前数据库的最大连接数 -1代表无限制
]
案例
CREATE DATABASE my_db1
WITH OWNER gpadmin
ENCODING 'utf-8'
TABLESPACE pg_dafault
CONNECTION LIMIE 10;
1.1.2、切换数据库
如果是使用 PSQL 的 CLI 命令行的话,我们可以使用下面的命令来切换数据库:
\c my_db1
使用 DataGrip 只能通过下面的按钮来切换
1.1.3、创建 schema
schema 相当于是一种归类分组的作用,毕竟海量数据场景下,一个数据库下面可能有成千上万张表,Greenplum 在库和表之间添加了一层 schema 使得表可以更好被管理。
CREATE SCHEMA my_biz;
1.1.4、查询所有数据库
同样,如果在 PSQL 的 CLI 命令行的话可以通过下面的命令来查看所有数据库:
\l
也可以使用下面的 SQL 命令:
-- 显示所有的库
SELECT * FROM pg_database;
1.1.5、删除数据库
如果要删除数据库,必须先离开该数据库(\c 切换到别的数据库)才能删除
DROP DATABASE my_db1;
1.2、表操作
1.2.1、创建表
语法
CREATE [EXTERNAL] TABLE table_name( -- 创建外部表,建表的同时可以指定一个实际数据的路径(location 可以是linux,也可以是 HDFS)
column1 datatype [NOT NULL] [DEFAULT] [CHECK] [UNIQUE], -- 字段约束
column2 datatype,
column3 datatype,
.....
columnN datatype,
[PRIMARY KEY()] -- 指定当前主键
)[ WITH ()] -- 定义数据追加方式、压缩格式、压缩级别等
[LOCATION()] -- 如果使用外部表才会配合使用这个关键字
[FORMAT] -- 定义当前表的存储格式
[COMMENT] -- 注释
[PARTITION BY] -- 分区字段 同时也是创建分区表的关键字
[DISTRIBUTE BY ()]; -- 指定分布数据的键值(比如使用哈希算法计算数据的存储位置)
内部表和外部表的区别
(1)内部表(Regular Tables)
数据存储:内部表的数据直接存储在 GreenPlum 数据库的数据文件中。这意味着数据被物理存储在数据库服务器上。
事务管理:内部表完全支持事务管理。这包括 ACID 属性(原子性、一致性、隔离性和持久性),确保数据完整性和可靠性。
索引和约束:你可以在内部表上创建索引和约束,这有助于提高查询性能和维护数据完整性。
管理和维护:内部表可以使用数据库的全部管理和维护功能,如备份和恢复。
适用性:适用于需要高性能查询和事务完整性的数据。
(2)外部表(External Tables)
数据存储:外部表的数据存储在数据库外部,如在文件系统、Hadoop HDFS 或任何可通过 SQL/MED(SQL Management of External Data)访问的数据源。外部表仅存储数据的元数据和位置信息。
事务管理:外部表不支持事务管理。它们主要用于读取和加载操作,不保证 ACID 属性。
索引和约束:由于数据实际存储在外部,你不能在外部表上创建索引或强制执行数据库级别的约束。
管理和维护:外部表的管理相对简单,因为它们只是对外部数据源的引用。备份和恢复通常不适用于外部表本身,而是应用于数据源。
适用性:适用于 ETL(Extract, Transform, Load)操作,即从外部数据源提取数据,然后可能将其转换和加载到内部表中进行进一步处理。
案例
创建外部表这里使用的数据源是 linux 文件系统下的一个 csv文件,需要我们使用 Greenplum 为该路径开启一个 gpfdist 服务:
-- -d指定数据所在目录 -p 指定端口
gpfdist -d ./ -p 8081 &
-- 创建内部表
CREATE TABLE doctor(
doctor_id serial primary key ,
name varchar(100),
department varchar(100),
hire_date date
);
INSERT INTO doctor (name, department, hire_date) VALUES
('小美','护士','2024-07-08'),
('二狗','呼吸内科','2024-07-08'),
('铁蛋','骨科','2024-07-08');
DROP EXTERNAL TABLE supplier;
-- 外部表
CREATE EXTERNAL TABLE supplier(
id varchar(10),
name varchar(20),
job varchar(20),
birthday varchar(20)
)
LOCATION ('gpfdist://hadoop102:8081/patient.csv')
FORMAT 'CSV';
-- 查询外部表
SELECT * FROM supplier;
查询结果:
1.2.2、修改表
修改表名
ALTER TABLE table_name RENAME TO new_name;
增加/修改/替换列信息
-- 新增列
ALTER TABLE doctor ADD COLUMN addr varchar(20);
-- 更新列名
ALTER TABLE doctor RENAME addr TO address;
-- 更新列数据类型
ALTER TABLE doctor ALTER COLUMN age TYPE int;
-- 删除列信息
ALTER TABLE doctor DROP COLUMN address;
1.2.3、清空表
注意:只能清除内部表,但是不能清除外部表
TRUNCATE TABLE doctor;
1.2.4、删除表
DROP [EXTERNAL] TABLE table_name;
2、DML
2.1、数据导入
2.1.1、copy 方式
语法
COPY table_name FROM file_path DELIMITER sep;
创建内部表并准备数据:
CREATE TABLE student(
name varchar(20),
department varchar(20),
age int
);
导入并查询(这里的文件路径为主节点的文件路径,上面的外部表数据源虽然也在主节点但是需要通过 gpfdist 协议,和这里不一样):
COPY student FROM '/home/gpadmin/software/test/student.csv' DELIMITER ',';
SELECT * FROM student;
查询结果:
2.1.2、通过查询向表中查询数据
INSERT INTO student
SELECT name,job AS department,0 AS age FROM supplier;
2.1.3、通过查询语句创建并加载数据
CREATE TABLE student2 AS SELECT * FROM student;
2.2、数据导出
COPY student2 TO '/home/gpadmin/software/test/student.txt';
2.3、数据更新和删除
2.3.1、更新数据
UPDATE student2 SET age = 18,name = 'test' WHERE age = 0;
2.3.2、删除数据
DELETE FROM student2 WHERE age = 20;
总结
剩下的一些查询语句已经在 MySQL、HQL 中练习很多了,这里不再浪费时间了,下去之后多花点时间练练 SQL 题就OK了。
关于 Greenplum 再深入的内容比如分布式事务、数据备份与迁移等资料网上比较少,之后慢慢精进。