一、Hive的分区:我理解为类似mysql分表的概念。Hive表所在的文件夹下面将数据文件按规则分成多个。这样单涉及其中一个文件时会提高效率。
建表的同时分区.注意分区也是一列。所以下面设置分区,属性处就不能有一样的(如下列中的age)。避免重复。
下面为单分区建表:
create table psn3
(
id int,
name string,
likes array<string>,
address map<string,string>
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':';
加载数据并在处理时分区:load data local inpath '/root/data/data' into table psn3 partition(age=20);
分区后效果:
当然还有双分区、多分区等。
注意分区是在创建表的时候指定的。不可以后需添加。而官网中的add partition其实是添加分区的值(不能修改或添加列),但是分区的顺序可以换(当多个分区时),他真正的分区顺序是在定义是完成的,这里是个匹配的过程。修改语句如下
alter table psn4 add partition(age=30);
分区的删除: 可以删除单个分区(也可删除多个中的其中一个);
以上为静态分区。
查询分区信息:show partitions psn3;
修复分区:分区信息为元数据信息。如果文件存储格式按照分区规则存储,新建分区的表后,直接查询(中间没有拉取数据形成分区的过程),这时直接查询是查不到结果的。执行:Msck repair table psn5;产生了元数据信息。所以修复了分区。
二、DML
创建表除了之前提到的方式,还有几种:
注意:之前提到的load data local input 'x/x' into table xxx 中的local去掉则是从hdfs中拉取数据。但是被拉取后数据所在文件是移动过来的。原位置文件会不再存在。
1、这个注意 要insert的表要提前创建好。
from psn
insert overwrite table psn6
select id,name
insert overwrite table psn7
select id,name;
删除与修改的操作进行时要实现事务。一般不做删除与修改。
三、HiveSerDe
类似 row format的功能:
四、Hive Beeline:客户端。常使用。
Beeline是hiveserver2的客户端hiveserver2支持同时多个远程访问。支持JDBC/ODBC访问。
代码:
五、Hive函数。这里自行阅读官网。直接搜UDF即可。
Hive sql中不支持in 、exits。
map与array的个数。
自定义函数:打包完成后,最后一句是创建临时函数。
第二种:
练习:之前的单词统计使用hive sql完成?
数据:word as scala
java scala as love sel
word java python ll
1、数据放到linux(略)
2、创建表 拉取数据:
create table wc3
(
line string
);
load data local inpath 'test.txt' into table wc3;
3、创建结果表:
create table wc4
(
word string,
count int
)
row format delimited
fields terminated by ',';
4、数据转换:
from (select explode(split(line,' ') w) from wc3)t
insert into wc4
select w,count(w) group by w;
完成。