/*
HQL DML语句介绍:
它指的是 数据操作语言, 主要是用来 操作表数据的, 对表数据进行 增删改操作, 这里特指的是: 如何往Hive表中新增数据.
数据导入:
流向:
Linux, HDFS => Hive
方式:
1. 通过 load data方式实现.
2. 通过 insert + select 方式实现, 相对更灵活.
load data方式详解:
格式:
load data [local] inpath '源文件的路径' [overwrite] into table 表名;
解释:
1. 加local指的是本地路径, 即: Linux文件路径. 路径前缀要加 file:/// 可以省略不写.
不加local指的是HDFS路径, 路径前缀要加 hdfs://node1:8020/ 可以省略不写.
2. 不写overwrite是追加写入, 如果写了(overwrite)则是覆盖写入.
insert + select 方式详解:
格式:
insert [into | overwrite] table 表名 partition(分区字段=值)
select 列1, 列2... from 表名;
细节:
1. into是追加写入, 后续的table可以省略.
overwrite是覆盖写入, 后续的table不能省略.
2. 插入的时候, 要求和查询出的列的个数, 对应的数据类型必须保持一致, 至于列名, 表名无所谓.
3. insert + select方式底层回转MR程序来执行.
数据导出:
格式:
insert overwrite [local] directory '目的地目录的路径' row format delimited fields terminated by '行格式分隔符'
select 列1, 列2... from 表名;
细节:
1. 加local是Linux路径, 不加则是HDFS路径.
2. 导出时, 是覆盖导出, 可以指定字段分隔符.
*/
-- ----------------------------------- 场景1: 数据导入之 load方式 -----------------------------------
-- 0. 切库
use day06;
-- 1. 创建学生表.
create table stu(
id int,
name string,
gender string,
age int,
sno string
) row format delimited fields terminated by ',';
create table stu_hdfs(
id int,
name string,
gender string,
age int,
sno string
) row format delimited fields terminated by ',';
-- 2. 通过load方式加载数据到 stu表中.
-- 2.1 从Linux中加载数据到stu表中, 追加写入.
load data local inpath '/export/data/hivedata/students.txt' into table stu; -- 不转MR, Linux的源文件还在, 相当于拷贝一份给HDFS.
-- 2.2 从Linux中加载数据到stu表中, 覆盖写入.
load data local inpath '/export/data/hivedata/students.txt' overwrite into table stu; -- 不转MR, Linux的源文件还在, 相当于拷贝一份给HDFS.
-- 2.3 从HDFS中加载数据到stu表中. 追加写入 和 覆盖写入都一样, 就是看有没有写 overwrite单词.
load data inpath '/wordcount/students.txt' into table stu_hdfs; -- 不转MR, HDFS的源文件不在了, 相当于: 剪切.
-- 3. 查询表数据.
select * from stu;
select * from stu_hdfs;
-- ----------------------------------- 场景2: 数据导入之 insert + select方式 ------------------------
-- 格式: insert into 表名 select 列1, 列2.. from 表名;
-- 总结: insert + select 方式要求 列的个数, 对应列的数据类型均要求一致, 对列名和表名无要求.
-- 1. 建表.
create table stu_insert(
id int,
name string,
gender string,
age int,
sno string
) row format delimited fields terminated by ',';
-- 2. insert + select方式导入数据.
insert into table stu_insert select * from stu; -- 会转MR程序, into方式是 追加写入, table可以省略.
insert overwrite table stu_insert select * from stu; -- 会转MR程序, overwrite方式是 覆盖写入, table不可以省略.
insert overwrite table stu_insert
select hp_max, name, attack_range, mp_max, role_main from t_archer; -- 因为列的个数, 对应的数据类型相同, 所以插入成功.
insert overwrite table stu_insert select * from t_archer; -- 因为列的个数, 对应的数据类型不同, 所以插入失败.
-- 3. 查询表数据.
select * from stu_insert;
-- ----------------------------------- 场景3: 数据导出 --------------------------------------------
/*
数据导出:
格式:
insert overwrite [local] directory '目的地目录的路径' row format delimited fields terminated by '行格式分隔符'
select 列1, 列2... from 表名;
细节:
1. 加local是Linux路径, 不加则是HDFS路径.
2. 导出时, 是覆盖导出, 可以指定字段分隔符.
*/
-- 1. 查看表数据.
show tables;
select * from stu; -- 44条数据.
-- 2. 将stu的表数据导出到 Linux目录中.
insert overwrite local directory '/export/data/hivedata' select * from stu; -- 覆盖导出, 默认分隔符'\001'
insert overwrite local directory '/export/data/hivedata2' row format delimited fields terminated by '#'
select * from stu; -- 覆盖导出, 指定分隔符为'#'
insert overwrite local directory '/export1/data2/hivedata3' row format delimited fields terminated by '!'
select * from stu; -- 覆盖导出, 指定分隔符为'#'
-- 3. 将stu的表数据导出到 HDFS目录中.
insert overwrite directory '/wordcount' row format delimited fields terminated by '$'
select id, name, age from stu;
-- ----------------------------------- 场景4: hive第1代客户端的作用 --------------------------------------------
/*
Hive的第1代客户端指的是: /export/server/hive/bin/hive, 它的作用有四个, 分别是:
1. 充当客户端使用, 可以写Hive SQL
2. 开启metastore 和 hiveserver2服务.
nohup hive --service metastore &
nohup hive --service hiveserver2 &
3. 可以执行一次Hive SQL语句, 执行结束, 会自动断开会话.
hive -e 'HQL语句;'
4. 可以执行Hive SQL脚本.
Hive SQL脚本解释: 可以是任意后缀名的文件, 文件中的内容必须符合HQL规范, 建议后缀名为 .sql
hive -f 'HQL脚本'
*/
Hive SQL DML语句(操作表数据)
于 2023-09-06 16:07:09 首次发布