• 一、DDL操作(数据定义语言)包括:Create、Alter、Show、Drop等。
• create database- 创建新数据库
• alter database - 修改数据库
• drop database - 删除数据库
• create table - 创建新表
• alter table - 变更(改变)数据库表
• drop table - 删除表
• create index - 创建索引(搜索键)
• drop index - 删除索引
• show table - 查看表
• 二、DML操作(数据操作语言)包括:Load 、Insert、Update、Delete、Merge。
• load data - 加载数据
• insert into - 插入数据
• insert overwrite - 覆盖数据(insert ... values从Hive 0.14开始可用。)
• update table - 更新表(update在Hive 0.14开始可用,并且只能在支持ACID的表上执行)
• delete from table where id = 1; - 删除表中ID等于1的数据(delete在Hive 0.14开始可用,并且只能在支持ACID的表上执行)
• merge - 合并(MERGE在Hive 2.2开始可用,并且只能在支持ACID的表上执行)
注意:频繁的update和delete操作已经违背了Hive的初衷。不到万不得已的情况,还是使用增量添加的方式最好。

1.实验环境准备
1)新建目录,并下载安装包
mkdir -p /data/hive2
cd /data/hive2
wget http://192.168.1.100:60000/allfiles/hive2/cat_group
wget http://192.168.1.100:60000/allfiles/hive2/goods
2)检查hadoop、Mysql、Hive是否启动,若无则启动
jps
cd /apps/hadoop/sbin
./start-all.sh
sudo service mysql status
sudo service mysql start
cd /apps/hive/bin
./hive

2.Hive数据仓库的操作
1)创建一个数据仓库,名为DB
create database DB;
create database if not exists DB; #优化命令
2)查看数据仓库DB的信息及路径
describe database DB;
3)删除名为DB的数据仓库
drop database if exists DB;

3.Hive数据表的操作
1)查看已存在的表
show tables;
2)创建一个名为cat的内部表
create table cat(cat_id string,cat_name string);
show tables;
3)创建一个外部表,表明为cat2
create external table if not exists cat2(cat_id string, cat_name string);
show tables;
4)修改cat表的表结构
alter table cat add columns(group_id string,cat_code string);
desc cat; #查看表结构
alter table cat2 rename to cat3;
5)删除
drop table cat3;
show tables;
6)创建相同结构的表
create table cat4 like cat;
show tables;

4.四种Hive中数据的导入方式
1)从本地文件系统中导入数据到Hive表
#首先创建一个表,包含两个字段,以“\t”为分隔符
create table cat_group(group_id string,group_name string)
row format delimited fields terminated by '\t' stored as textfile;
show tables;
#然后将Linux本地/data/hive2目录下的文件导入到表中
load data local inpath '/data/hive2/cat_group' into table cat_group;
#查看数据
select * from cat_group limit 10;
2)将HDFS上的数据导入到Hive中
#首先在另一个终端窗口,在HDFS上创建/myhive2目录
hadoop fs -mkdir /myhive2
#将本地/data/hive2/下的表上传到HDFS的/myhive2上,并查看是否创建成功
hadoop fs -put /data/hive2/cat_group /myhive2
hadoop fs -ls /myhive2
#在Hive中创建表
create table cat_group1(group_id string,group_name string)
row format delimited fields terminated by '\t' stored as textfile;
#将HDFS中的表导入到Hive中,并查看结果
load data inpath ‘/myhive2/cat_group’ into table cat_group1;
select * from cat_group1 limit 10;
3)从别的表中查询出相应的数据导入到Hive中
#首先创建一个表
create table cat_group2(group_id string,group_name string)
row format delimited fields terminated by '\t' stored as textfile;
#将上一步得到的表的数据导入到新表中
insert into(或者用overwrite) table cat_group2 select * from cat_group1;
#查看数据
select * from cat_group2 limit 10;
4)在建新表时,从别的表中查询出相应的数据插入到正在创建的表中
create table cat_group3 as select *from cat_group2;

5.三种Hive中数据的导出方式
1)导出到本地文件系统
#首先在本地新建/data/hive2/out目录
mkdir -p /data/hive2/out
#将Hive的cat_group表导出到上述目录
insert overwrite local directory ‘/data/hive2/out’ select * from cat_group;
#在本地切换到/data/hive2/out目录,cat命令查询
ls
cat 000000_0
#刚刚查看的文件字符间没有分割,以下为导出改进方法
insert overwrite local directory ‘/data/hive2/out’ select group_id,concat(‘\t’,group_name) from cat_group;
2)导出到HDFS中
#在HDFS上创建/myhive2/out目录
hadoop fs -mkdir /myhive2/out
#将Hive的cat_group表导出到上述目录
insert overwrite directory ‘/myhive2/out’ select group_id,concat(‘\t’,group_name) from cat_group;
#查看数据
hadoop fs -ls /myhive2/out
3)导出到Hive的另一个表中
#首先在Hive中创建一个表
create table cat_group4(group_id string,group_name string)
row format delimited fields terminated by '\t' stored as textfile;
#将旧表的数据导出到新表中
insert into table cat_group4 select * from cat_group;
#查看数据
select * from cat_group4 limit 10;

6.Hive分区表的操作
1)创建分区表goods,并查看结构
create table goods(goods_id string,goods_status string) partitioned
by (cat_id string) row format delimited fields terminated by '\t';
desc goods;
2)向分区表插入数据
#首先在Hive创建一个非分区表goods_1,用于存储本地表goods的数据
create table goods_1(goods_id string,goods_status string,cat_id string)
partitioned by (cat_id string) row format delimited fields terminated by '\t';
#将本地表goods的数据导入到上述新表中
load data local inpath ‘/data/hive2/goods’ into table goods_1;
#再将表goods_1的数据导入到分区表goods中
insert into table goods partition(cat_id=‘52052’) select goods_id,goods_status from goods_1 where cat_id=‘52052’;
#查看数据
select * from goods limit 10;
3)查看表goods的分区
show partitions goods;
4)修改表分区
alter table goods partition(cat_id=52052) rename to partition(cat_id=52051);
show partitions goods;
5)删除表分区
#先备份出一个goods_2表
create table goods_2(goods_id string,goods_status string)
partitioned by (cat_id string) row format delimited fields terminated by '\t';
insert into table goods_2 partition(cat_id=‘52052’) select goods_id,goods_status from goods_1 where cat_id=‘52052’;
#删除goods表中的cat_id分区
alter table goods drop if exists partition (cat_id=’52051’)
show partitions goods;

7.Hive桶的操作
1)创建桶
#创建goods_t表,按照一列聚类另一列排序,划分成两个桶
create table goods_t(goods_id string,goods_status string)
partitioned by (cat_id string) clustered by(goods_status)
sorted by (goods_id) into 2 buckets;
#设置环境变量
set hive.enforce.bucketing=true;
2)向goods_t表中插入goods_2表中的数据
from goods_2 insert overwrite table goods_t partition(cat_id=‘52063’) select goods_id,goods_status;
3)查看结果
select * from goods_t tablesample(bucket 1 out of 2 on goods_id);

tablesample(bucket x out of y)

y必须是table总bucket数的倍数或者因子。hive根据y的大小,决定抽样的比例。例如,table总共分了64份,当y=32时,抽取(64/32=)2个bucket的数据,当y=128时,抽取(64/128=)1/2个bucket的数据。
x表示从哪个bucket开始抽取。例如,table总bucket数为32,tablesample(bucket 3 out of 16),表示总共抽取(32/16=)2个bucket的数据,分别为第3个bucket和第(3+16=)19个bucket的数据。

Hive HQL操作
1.环境准备
1)首先检查Hadoop是否启动,若无则启动
jps
cd /apps/hadoop/sbin
./start-all.sh
2)启动Mysql库,用于存放Hive的元数据
sudo service mysql start
3)启动Hive命令行
hive
4)打开新的命令行,创建新目录用于存放原始文件
mkdir -p /data/hive3
cd /data/hive3
wget ……
5)在Hive命令行,创建两个表,以‘\t’为分隔符
create table buyer_log(id string,buyer_id string,dt string,ip string,opt_type string)
row format delimited fields terminated by '\t' stored as textfile;
create table buyer_favorite(buyer_id string,goods_id string,dt string)
row format delimited fields terminated by '\t' stored as textfile;
6)将下载到本地的表中数据导入到Hive中
load data local inpath '/data/hive3/buyer_log' into table buyer_log;
load data local inpath '/data/hive3/buyer_favorite' into table buyer_favorite;

2.查询操作
1)普通查询
select * from buyer_log limit 10;
2)别名查询
select b.id,b.ip from buyer_log b limit 10;
3)限定查询(where)
select buyer_id from buyer_log where opt_type=1 limit 10;
4)两表或多表联合查询
select l.dt,f.goods_id from buyer_log l,buyer_favorite f where l.buyer_id=f.buyer_id limit 10;
5)多表插入
#先创建两个新表
create table buyer_log1 like buyer_log;
create table buyer_log2 like buyer_log;
#再将buyer_log的数据插入到两个新表中
from buyer_log
insert overwrite table buyer_log1 select
insert overwrite table buyer_log2 select
;
6)多目录输出文件,将同一文件输出到本地不同文件夹
from buyer_log
insert overwrite local directory ‘/data/hive3/out’ select
insert overwrite local directory ‘/data/hive3/out1’ select
;
#切入到本地目录/data/hive3查询是否成功输出
cd /data/hive3
ls out
ls out1

3.使用shell脚本调用Hive查询语句
1)编写脚本sh1
cd /data/hive3
vim sh1
#!/bin/bash
cd /apps/hive/bin;
hive -e ‘show tables;’
2)赋予执行权限,并执行
chmod +x sh1
./sh1

4.排序
1)Order by=全局排序
select * from goods_visit order by click_num desc limit 10;
2)Sort by=局部排序
#设置Reduce个数为3
set mapred.reduce.tasks=3;
3)Group by=分组操作

4)Distribute by=分发为不同文件导出
#设置Reduce个数为3
set mapred.reduce.tasks=3;
#按照buyer_id做分发,输出到本地/data/hive4/out目录中
insert overwrite local directory ‘/data/hive4/out’ select * from buyer_favorite distribute by buyer_id;
#结果是:在/data/hive4/out目录下按照buyer_id分成了3个文件
cd /data/hive4/out
ls
5)Cluster by=distribute+sort
#设置Reduce个数为3
set mapred.reduce.tasks=3;
#按照buyer_id分成三个文件,并按buyer_id排序
select * from buyer_favorite cluster by buyer_id

Hive DDL、DML操作的更多相关文章

  1. 入门大数据---Hive常用DML操作

    Hive 常用DML操作 一.加载文件数据到表 1.1 语法 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename ...

  2. Hive DDL DML SQL操作

    工作中经常要用到的一些东西,一直没整理,用的多的记住了,用的不多的每次都是去查,所以记录一下. DDL(数据定义语言),那就包括建表,修改表结构等等了 建表:create hive table hiv ...

  3. Hive| DDL| DML

    类型转换 可以使用CAST操作显示进行数据类型转换 例如CAST(' 转换成整数1:如果强制类型转换失败,如执行CAST('X' AS INT),表达式返回空值 NULL. : jdbc:hive2: ...

  4. Hive的DML操作

    1. Load 在将数据加载到表中时,Hive 不会进行任何转换.加载操作是将数据文件移动到与 Hive表对应的位置的纯复制/移动操作. 语法结构: load data [local] inpath ...

  5. Hive DDL&DML

    1.删除分区 ALTER TABLE table_name DROP IF EXISTS PARTITION(dt=') 如果是外部表,记得rm对应文件 2.添加分区 ALTER TABLE tabl ...

  6. Hive 学习之路(七)—— Hive 常用DML操作

    一.加载文件数据到表 1.1 语法 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (p ...

  7. Hive 系列(七)—— Hive 常用 DML 操作

    一.加载文件数据到表 1.1 语法 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (p ...

  8. ORA-38301:can not perform DDL/DML over objects in Recycle Bin

    一个智障操作,drop一个用户,下面的东西比较多,删得比较慢,然后shell突然关了. 就导致了,删不掉,又不能创建新的用户.出版本要得比较急,就先创建新的用户测试去了. 今天要弄个东西,又想起这个事 ...

  9. Hive数据据类型 DDL DML

    Hive的基本数据类型 DDL DML: 基本数据类型 对于Hive而言String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以 ...

随机推荐

  1. 多线程之NSOperation小结

    一.NSOperation 抽象类 NSOperation 是一个"抽象类",不能直接使用.抽象类的用处是定义子类共有的属性和方法. NSOperation 是基于 GCD 做的面 ...

  2. Too many open files的四种解决办法

    [摘要] Too many open files有四种可能:一 单个进程打开文件句柄数过多,二 操作系统打开的文件句柄数过多,三 systemd对该进程进行了限制,四 inotify达到上限. 领导见 ...

  3. openlayers4 入门开发系列之前端动态渲染克里金插值 kriging 篇(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  4. 改变SecureCRT的背景颜色

    1.在使用secureCRT客户端时,可以连接服务器,默认为白色底. 2.要进行对把底色的白色改为黑色的底色,右击的窗口的位置. 3.下拉菜单中点击 Session Options 4.点击Appea ...

  5. python为前端提供API

    作为一名前端来学习后端语言,有难度啊.这里把第一次尝试的过程做个记录 1.网上看到Python给前端提供API可以使用python的flaskweb框架 #py文件 import json from ...

  6. Rabbitmq-单机安装

    Rabbitmq介绍   官网地址:https://www.rabbitmq.com RabbitMQ是一款在全球范围内使用非常广泛的开源消息队列中间件.它轻量级.易部署.并支持多种协议.它基于Erl ...

  7. ansible部署apache

    Ansible 配置Apache(加粗的字体是要执行的命令) 配置免密登录 [root@localhost ansible]# vim /etc/ansible/hosts //用来配置目标主机 加入 ...

  8. poj 3241 Object Clustering (曼哈顿最小生成树)

    Object Clustering Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 2640   Accepted: 806 ...

  9. 线程中put(None)和主函数中put(None)的区别和用法

    ''' 初试生产者消费者模型代码 分析: 对象含有生产者.队列.消费者 Queue队列模块,不适合传大文件,通常传一些消息. ''' '''多生产者进程和多消费者进程''' #导入模块 from mu ...

  10. wc命令统计目录下所有文件行数

    想统计一下最近一个项目的代码行数,一个一个文件统计显然不是程序员的思维,wc命令可以统计一个文本的行数,结合find命令可以实现我的需求(注意符号):