Hive DDL、DML操作
• 一、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操作的更多相关文章
- 入门大数据---Hive常用DML操作
Hive 常用DML操作 一.加载文件数据到表 1.1 语法 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename ...
- Hive DDL DML SQL操作
工作中经常要用到的一些东西,一直没整理,用的多的记住了,用的不多的每次都是去查,所以记录一下. DDL(数据定义语言),那就包括建表,修改表结构等等了 建表:create hive table hiv ...
- Hive| DDL| DML
类型转换 可以使用CAST操作显示进行数据类型转换 例如CAST(' 转换成整数1:如果强制类型转换失败,如执行CAST('X' AS INT),表达式返回空值 NULL. : jdbc:hive2: ...
- Hive的DML操作
1. Load 在将数据加载到表中时,Hive 不会进行任何转换.加载操作是将数据文件移动到与 Hive表对应的位置的纯复制/移动操作. 语法结构: load data [local] inpath ...
- Hive DDL&DML
1.删除分区 ALTER TABLE table_name DROP IF EXISTS PARTITION(dt=') 如果是外部表,记得rm对应文件 2.添加分区 ALTER TABLE tabl ...
- Hive 学习之路(七)—— Hive 常用DML操作
一.加载文件数据到表 1.1 语法 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (p ...
- Hive 系列(七)—— Hive 常用 DML 操作
一.加载文件数据到表 1.1 语法 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (p ...
- ORA-38301:can not perform DDL/DML over objects in Recycle Bin
一个智障操作,drop一个用户,下面的东西比较多,删得比较慢,然后shell突然关了. 就导致了,删不掉,又不能创建新的用户.出版本要得比较急,就先创建新的用户测试去了. 今天要弄个东西,又想起这个事 ...
- Hive数据据类型 DDL DML
Hive的基本数据类型 DDL DML: 基本数据类型 对于Hive而言String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以 ...
随机推荐
- Semaphore回顾
用途 在多线程访问可变变量时,是非线程安全的.可能导致程序崩溃.此时,可以通过使用信号量(semaphore)技术,保证多线程处理某段代码时,后面线程等待前面线程执行,保证了多线程的安全性.使用方法记 ...
- [UWP]使用CompositionGeometricClip裁剪复杂图形及进行动画
1. UWP中的其它裁剪方案 之前在 这篇文章 里,我介绍了如何使用UIElement.Clip裁剪UIElement的内容,使用代码如下: <Canvas> <Image Sour ...
- webpack4分包方案
webpack4放弃了 commonsChunkPlugin,使用更方便灵活智能的 splitChunks 来做分包的操作. 下面有几个例子,并且我们假设所有的chunks大小至少为30kb(采用sp ...
- Vue-Router中History模式【华为云分享】
[摘要] vue-router的history模式的服务端支持 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端> ...
- 【Python成长之路】从零学GUI -- 制作智能聊天机器人
[写在前面] 鹏哥:最近老惹小燕同学不开心,结果都没人陪我聊天了.哎,好无聊呀! 肥宅男:女朋友什么的最无聊了,还没我的图灵机器人好玩. 鹏哥:图灵?好巧,和我部门同名. [效果如下] [实现过程] ...
- luogu P2860 [USACO06JAN]冗余路径Redundant Paths |Tarjan
题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1. ...
- html格式化输出JSON( 测试接口)
将 json 数据以美观的缩进格式显示出来,借助最简单的 JSON.stringify 函数就可以了,因为此函数还有不常用的后面2个参数. 见MDN https://developer.mozilla ...
- CF 1130A 1130B 1130C1129A1 1129A2 1129B(Round542A B C D1 D2 E)题解
A : Be Positive 题目地址:https://codeforces.com/problemset/problem/1130/A 题解:让你求是否满足一个d使得数列长为n的a数组的每个数除以 ...
- HDU-6119
度度熊喜欢着喵哈哈村的大明星——星星小姐. 为什么度度熊会喜欢星星小姐呢? 首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听. 但这都不是最重要的,最重要的是,星星小姐拍的一手好代码! 于是度度 ...
- 小程序 - 简单实现mixin功能
前言 在业务中有没有一个场景:多个页面需要用到一样的 data 和 method,或者生命周期都需要执行同样的操作.我们在每个页面都写上重复的代码,一但功能修改就要更新多个页面,在后期维护起来会很麻烦 ...