首页 > 技术文章 > hive相关操作

hatcher-h 2020-06-02 21:00 原文

建库

创建一个hive数据库,在hdfs中就会创建一个文件夹
创建库
create database 库名;
查看库相关信息
desc database 库名;
查看库详细信息
desc database extended 库名;

建表

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
   [(col_name data_type [COMMENT col_comment], ...)] 
   [COMMENT table_comment] 
   [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 
   [CLUSTERED BY (col_name, col_name, ...) 
   [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
   [ROW FORMAT row_format] 
   [STORED AS file_format] 
   [LOCATION hdfs_path]

external 定义我们的表为外部表
location  指定我们表里面的数据应该存放在hdfs的哪个位置 
partitioned by 创建分区表  按照文件夹,将不同的数据,划分到不同的文件夹下面去
clustered  by   分桶表  将我们的数据按照一定的规则,划分到多个文件里面去
store as  指定数据的存储格式 text  sequenceFile  parquet  orc
row  format    指定我们hive建表的分隔符,与我们hdfs的数据的分隔符保持一致,才能够映射hdfs上面的数据到对应的hive的表的字段里面来

hive表模型

内部表

删表同时删除数据
建表
use myhive;
create table stu(id int,name string);
insert into stu values (1,“zhangsan”);
select * from stu;

创建表并指定字段之间的分隔符,存储格式,路径
create table if not exists stu2(id int ,name string) row format delimited fields terminated by ‘\t’ stored as textfile location ‘/user/stu2’;

根据查询结果创建表
create table stu3 as select * from stu2;

根据已经存在的表结构创建表:复制表结构,不复制表数据
create table stu4 like stu2;

查询表的类型
desc formatted stu2;

外部表

删表不删数据,将其他数据加载到这个表中,同时移动那个文件。
create external table xxx row format delimited fields terminated by "\t" location "/sss/xxx";
内部表和外部表的使用场景
每天将收集到的网站日志定期流入HDFS文本文件。在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过SELECT+INSERT进入内部表。

分区表

一般没有一种独立的表模型,只有内部分区表,或者外部分区表。

核心的思想:分治:数据量越少,跑起来就会越快

可以按照一定的规则,创建一些文件夹,可以根据指定的文件夹,找到我们指定的数据。比如每天创建一个。
create table xxx() partitioned by(month string);
增加分区
alter table xx add partition(month="01");
查看分区
show partitions xxx;
加载数据方式
load data local inpath "本地文件" into table xxx;
insert overwrite table xxx select * from xxx;

分桶表

create table xxx() clustered by(s_id) into 3 buckets;
分桶表加载数据需要用insert方式。

表相关修改

修改表名
alter table xxx rename to new_xxx;
增加字段
alter table xxx add columns (mycol string, mysco string);
修改字段
alter table xxx change column mysco mysconew int;

查询语法

基本上和sql一样,主要注意group by hive中使用grop by的时候select中出现的查询只能少于等于group by中的字段
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]

排序

hive的查询语法
1:order  by全局排序,只有一个reduceTask,如果数据量太大的话,那么就会导致数据处理速度非常慢
2:sort  by 只保证每个reducetask里面的数据有序,两个reducetaks之间的数据无序
3:distributed by  根据指定的字段,按照指定的字段进行 hash算法,确定我们的数据要去往哪一个reduce
4:cluster  by:除了具有distributed by的功能,还会对这个字段进行排序

hive Shell参数


hive当中的三种参数设置
第一种 : hive-site.xml 对所有的hive的客户端都有效

第二种:命令行的参数 bin/hive -hiveconf 参数名=参数值 对我们进入的这次会话有效
bin/hive -hiveconf hive.root.logger=INFO,console
这一设定对本次启动的Session(对于Server方式启动,则是所有请求的Sessions)有效。

第三种 :参数声明 对当前的sql语句生效 set 参数名=参数值
set mapred.reduce.tasks=100;
这一设定的作用域也是session级的。

参数声明 > 命令行参数 > 配置文件参数(hive)

hive 函数

hive函数
查看系统自带的函数
hive> show functions;
显示自带的函数的用法
hive> desc function upper;
详细显示自带的函数的用法
hive> desc function extended upper;

用户自定义函数
UDF(User-Defined-Function)
一进一出
UDAF(User-Defined Aggregation Function)
聚集函数,多进一出
类似于:count/max/min
UDTF(User-Defined Table-Generating Functions)
一进多出
如lateral view explore()

自定义函数

需要继承UDF
需要实现evaluate函数;evaluate函数支持重载;

hive的数据存储格式

行存储:TEXTFILE 、SEQUENCEFILE
列存储:、ORCPARQUET

推荐阅读