Hive基本操作

参考:
hive 表的常用操作
Hive基本操作

1 Thrift Server

Thrift 支持多种语言之间的RPC方式的通信;
Thrift为服务器端提供了多种工作模式,5中工作模式:TSimpleServer、TNonblockingServer、THsHaServer、TThreadPoolServer、TThreadedSelectorServer,

Hql ---> Thrift和JDBC客户端 ---> Driver ---> 逻辑计划/优化/物理计划---> MR ---> HDFS ---> 元数据存到Mysql/Derby

Hive的客户端:CLL/Beeline Thrift/JDBC

2 基本操作

1、创建数据库

create database tabletest;
create database if not exists tabletest;
//查看
desc database tabletest;
//删除
drop database tabletest;
desc database if not exists tabletest;
//使用
use tabletest;
//通过如下命令来修改这个默认的位置:
create database if not exists lyz location '/myown/dir';

建立一个新数据库,就会在HDFS的/user/hive/warehouse/中生成一个tabletest.db文件夹。
如果不创建新数据库,不使用hive>use <数据库名>,可以使用系统默认的数据库。可以显式使用hive> use default;默认会在/user/hive/warehouse/中建表

2、创建表

create table t_order(
id int,
name string,
rongliang string,
price double
)
row format delimited fields terminated by '\t';//声明文件分隔符

3、导入数据

//正常导入
load data local inpath "/path" into table t_order;
//从hdfs中导入
load data inpath  "/path" into table t_order;

//加载数据进行数据覆盖
hdfs dfs -put order.txt /user
load data inpath "/user/order.txt" overwrite into table t_order;

4、external表
EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。

create external table tab_ip_ext(
id int,
name string,
ip string,
country string
) row format delimited fields termianted by ',' 
stored as textfile
location '/external/hive';

在创建表的时候,就指定了HDFS文件路径,因此,源文件上传到/external/hive/文件夹即可。
外部表删除时,只删除元数据信息,存储在HDFS中的数据没有被删除。默认是内部表

5、分区表
作用:如果文件很大,用分区表可以快速过滤出按分区字段划分的数据。

t_order中有两个分区part1和part2
实际就是在HDFS中的t_order文件夹下面再建立两个文件夹,每个文件名就是part1和part2。

create table t_order (
id int,
name string,
rongliang, string,
price double
)
partitioned by (part_flag string)
row format delimited fields terminated by '\t';

插入数据:

load data local inpath "/home/hadoop/ip.txt" overwrite into table t_order partition(part_flag='part1');
load data local inpath "/home/hadoop/ip.txt" overwrite into table t_order partition(part_flag='part2');

就会把ip.txt文件上传到/t_order/part_flag='part1'/文件夹中。

查询数据:
查询时,分区字段也会显示,但是实际表中是没有这个字段的,是伪字段。

hive > select * from t_order  where part_flag='part1';
1       Lily       23     50    par1
2       Andy       20     50    par1
3       Tom        25     60    par2

hive中的分区 就是再多建一个目录, 优点:便于统计,效率更高,缩小数据集。
还有多级分区、动态分区(结合select查询)

6、分桶表
Hive里的分桶=MapReduce中的分区,而Hive中的分区只是将数据分到了不同的文件夹。
也即就是:
分区:划分文件夹
分桶:shuffle操作,聚合Key

1)创建分桶表

create table stu_buck(
Sno int,
Sname string,
Sex string,
Sage int,
Sdept string
)
clustered by (Sno)
sorted by (Sno DESC)
into 4 buckes
row format delimited fields terminated by ',';

含义:根据Sno字段分桶,每个桶按照Sno字段局部有序,4个桶。建桶的时候不会的数据做处理,只是要求插入的数据是被分好桶的。

2)分桶表内插入数据
一般不适用load数据进入分桶表,因为load进入的数据不会自动按照分桶规则分为四个小文件。所以,一般使用select查询向分桶表插入文件。

设置变量,设置分桶为true, 设置reduce数量是分桶的数量个数

set hive.enforce.bucketing = true;
set mapreduce.job.reduces=4;

insert overwrite table student_buck
select * from student cluster by(Sno)

insert overwrite table student_buck
select * from student distribute by(Sno) sort by(Sno asc);

其中,可以用distribute by(sno) sort by(sno asc)替代cluster by(Sno),这是等价的。cluster by(Sno) = 分桶+排序
先分发,再局部排序。区别是distribute更加灵活,可以根据一个字段分区,另外字段排序。
第二个子查询的输出了4个文件作为主查询的输入。

3)分桶表的原理与作用
原理:Hive是针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。

作用:
(1) 最大的作用是用来提高join操作的效率;
前提是两个都是分桶表且分桶数量相同或者倍数关系?
2)取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

思考这个问题:
select a.id,a.name,b.addr from a join b on a.id = b.id;
如果a表和b表已经是分桶表,而且分桶的字段是id字段
做这个join操作时,还需要全表做笛卡尔积吗?
对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。

7、insert语句
批量插入,实际上就是像文件夹中追加文件

create table tab_ip_like like tab_ip;
insert overwrite table tab_ip_like
select * from tab_ip;

向tab_ip_like中追加文件

8、保存select查询结果的几种方式
1、将查询结果保存到一张新的hive表中

create table t_tmp
as 
select * from t_p;

2、将查询结果保存到一张已经存在的hive表中

insert into table t_tmp
select * from t_p;

3、将查询结果保存到指定的文件目录(可以是本地,也可以是HDFS)

insert overwrite local directory "/home/hadoop/test"
select * from t_p;

//插入HDFS
insert overwrite directory "/aaa/test"
select * from t_p;

9、查看、删除
语法:

select [All  |  DISTINCT] select_expr, select_expr, ...
from table_reference
[where where_condition]
[group by col_list [HAVING condition]]
[[cluster by col_list] | [distribute by col_list] [sort by  | order by col_list]]
[limit number]

注:

  • cluster by字段含义:根据这个字段进行分区,需要注意设置reduce_num数量。
  • order by 会对输入做全局排序,因此只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。
  • sort by不是全局排序,其在数据进入reducer前完成排序。因此,如果用sort by进行排序,并且设置mapred.reduce.tasks>1,则sort by只保证每个reducer的输出有序,不保证全局有序。
  • distribute by(字段)根据指定的字段将数据分到不同的reducer,且分发算法是hash散列。
  • Cluster by(字段) 除了具有Distribute by的功能外,还会对该字段进行排序。
  • 因此,如果分桶和sort字段是同一个时,此时,cluster by = distribute by + sort by

distribute by必须要写在sort by之前。

10、Hive中的join
在线网站:https://sqlzoo.net/wiki/SELECT_.._JOIN
内连接:inner join(等值连接) join(笛卡儿积连接)
INNER JOIN 与 JOIN 是相同的。找出左右相同同的记录,,即就是求交集

左连接:left join
以左边表为准,逐条去右边表找相同字段;从左表(Customers)返回所有的行,即使右表(Orders)中没有匹配。

右连接:right join
以右边表为准,逐条去左边表找相同字段;从右表(Customers)返回所有的行,即使左表(Orders)中没有匹配。

全连接:full outer join

left semi join:相当于SQL的in语句

案例:
a表

id name
1 a
2 b
3 c
4 d
7 y
8 u

b表

id name
2 bb
3 cc
7 yy
9 pp
//建表
create table a(id int, name string)
row format delimited fields terminated by ',';
create table b(id int, name string)
row format delimited fields terminated by '',,
//导入数据
load data local inpath '/home/hadoop/a.txt' into table a;
load data local inpath '/home/hadoop/b.txt' into table b;

1、inner join
就是求交集。

select * from a inner join b on a.id = b.id;
//结果
+-------+---------+-------+---------+--+
| a.id | a.name | b.id | b.name |
+-------+---------+-------+---------+--+
| 2 | b | 2 | bb |
| 3 | c | 3 | cc |
| 7 | y | 7 | yy |
+-------+---------+-------+---------+--+

2、left join
右边没有找到连接的置空。

selct * from a left join b on a.id = b.id;

//结果
+-------+---------+-------+---------+--+
| a.id | a.name | b.id | b.name |
+-------+---------+-------+---------+--+
| 1 | a | NULL | NULL |
| 2 | b | 2 | bb |
| 3 | c | 3 | cc |
| 4 | d | NULL | NULL |
| 7 | y | 7 | yy |
| 8 | u | NULL | NULL |
+-------+---------+-------+---------+--+

3、right join
左边没有找到连接的置空。

select * from a right join b on a.id = b.id;

4、full outer join
两边数据都显示

select * from a full outer join b on a.id = b.id;
//结果
+-------+---------+-------+---------+--+
| a.id | a.name | b.id | b.name |
+-------+---------+-------+---------+--+
| 1 | a | NULL | NULL |
| 2 | b | 2 | bb |
| 3 | c | 3 | cc |
| 4 | d | NULL | NULL |
| 7 | y | 7 | yy |
| 8 | u | NULL | NULL |
| NULL | NULL | 9 | pp |
+-------+---------+-------+---------+--+

5、left semi join

select * from a left semi join b on a.id = b.id;
+-------+---------+--+
| a.id | a.name |
+-------+---------+--+
| 2 | b |
| 3 | c |
| 7 | y |
+-------+---------+--+
只返回左边一半,即a的东西;
只打印出了左边的表中的列,规律是如果主键在右边表中存在,则打印,否则过滤掉了。

11、创建临时表
可以存储中间结果

create temporary table tab_ip_ctas
as
select id new_id,name new_name, ip new_ip, country new_country
from tab_ip_ext
sort by new_id;

12、Hive可以自定义函数和Transform
自定义函数

UDF 作用于单个数据行,产生一个数据行作为输出。(数学函数,字符串函数)
UDAF(用户定义聚集函数):接收多个输入数据行,并产生一个输出数据行。(count,max)

创建临时函数与开发好的java class关联

create temporary function tolowercase as "com.bigdata.ToLowercase";

select id, tolowercase(name) from t_p;

13、Transform实现
Hive的Transform关键字提供了在SQL中调用自写脚本的功能;适合于不想写UDF时有需要自定义功能

create TABLE u_data_new as
SELECT
  TRANSFORM (movieid, rate, timestring,uid)
  USING 'python weekday_mapper.py'
  AS (movieid, rate, weekday,uid)
FROM t_rating;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 前端知识体系http://www.cnblogs.com/sb19871023/p/3894452.html 前端...
    秋风喵阅读 12,347评论 7 163
  • 我想要一种时光 缓缓流淌风平浪静 我想要一种牵挂 无声无息细水长流 十月末 天气转凉 你有没有及时添衣 是不是在这...
    DieFEE阅读 229评论 0 1
  • (译自http://www.spiritual-short-stories.com/spiritual-short...
    稷下阿蒙阅读 299评论 0 0
  • 文/琦灵 首先,请不要怀疑我捐献遗体的动机(目前我只是遗体捐献的志愿者)。这事儿,既不能换来金钱和...
    琦灵阅读 5,748评论 13 8
  • 今天上午在家陪孩子,下午陪朱宏去打篮球。很早就提醒他要快一点,临出门他还要玩一下游戏,我有一点生气。抱怨了几句,回...
    李丁梅阅读 95评论 1 2