一、基本的表操作
1.创建表(按不同的区分字符分组)
create table testTable( id int, name string, likes array, address map )ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY '-' MAP KEYS TERMINATED BY ':';
表结构的定义为:根据不同的分隔符来对文本中的数据信息进行过滤和创建表。
2.导入数据:
load data local inpath ‘/root/hivedata01.txt’ into table table01;
比insert的方式快很多倍。备注:其中local 如果不加表示数据在hdfs上,加了则是在linux系统本地。注意:往表里放完后会在hdfs上放一份。hdfs上放的是原始的数据信息。
备注: hive是读时模式,对写的操作不做检查。给他啥就导入啥。读的时候检查。
而像关系型数据库,是写时候模式。写的时候会检查。
测试例:
11,zhangsan,daqiu-kanshu-kandingyi,beijing:tiananmeng-shanghai:pudong-shengzheng:huaqingbei,nan,33 12,xiaoming,pingshu-xiangsheng-moshu,beijing:jingnan-hebei:zhijiazhan-henan:zhengzhou,nv,24
3.查询数据:select * from tablename;
上述的操作结果:
hive> select * from table02; OK 11 zhangsan ["daqiu","kanshu","kandingyi"] {"beijing":"tiananmeng","shanghai":"pudong","shengzheng":"huaqingbei"} 12 xiaoming ["pingshu","xiangsheng","moshu"] {"beijing":"jingnan","hebei":"zhijiazhan","henan":"zhengzhou"}
4.从hdfs 上查询表数据
hdfs dfs -cat /user/hive/warehouse/table02/*
备注1:查看表的属性信息 desc tablename;
查看表描述:desc formatted tablename;
5:其他的创建表的方式:
5.1 AS
CREATE TABLE table_new AS SELECT * from table_old;
会转成MapReduce执行创建新表。
5.1 LIKE
CREATE TABLE table_new LIKE table_old;
like的方式不会创建MapReduce的方式执行。
5.3 FROM
from chen insert into table result select *; // 把from 放前的原因是:select 后面可并列接各种方式的查询把结果都给result
二、表类型
2.1 内部表和外部表
区别在于内部表在固定的路径下,外部表需要自己定义位置而且加上关键字:EXTERNAL
eg:创建外部表
create EXTERNAL table externalTable( id int, name string, likes array, address map )ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY '-' MAP KEYS TERMINATED BY ':' LOCATION '/externalTable';
备注: 内部的表可以通过drop 的方式删除,同时删除元数据。对外部表而言,元数据被删除(通过hive 中 show tables查看是否删除;)。但是实际的数据却还在(hdfs上查看)。
2.2 分区表
内部分区表、外部分区表
内部分区表:
create table inner_part_table( id int, name string, likes array, address map ) PARTITIONED BY (sex string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY '-' MAP KEYS TERMINATED BY ':';
注意:分区字段必须是新的字段,不可以在原始的字段上作为分区字段。
分区在hdfs上体现在目录的增加。
新增分区:
ALTER TABLE inner_part_table ADD PARTITION(sex='unknown');
往分区表上推送数据:
load data local inpath 'hivedata01.txt' into table inner_part_table PARTITION(sex='nv');
对不同个数分区字段的分区表,设置上述的partitons的个数对应起来。
删除分区:
ALTER TABLE inner_part_table DROP PARTITION (sex='unknown')
在删除分区的时候注意:如果某2个目录下有同样的一个分区目录,删除此同样的目录,会是的2个目录同时被删除。
三、Hive SerDe
既: Serializer and Deserializer
SerDe 用于做序列化和反序列化。构建在数据存储和执行引擎之间,对两者实现解耦。Hive通过ROW FORMAT DELIMITED以及SERDE进行内容的读写。
举例 :
CREATE TABLE logtbl ( host STRING, identity STRING, t_user STRING, time STRING, request STRING, referer STRING, agent STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) \\[(.*)\\] \"(.*)\" (-|[0-9]*) (-|[0-9]*)" ) STORED AS TEXTFILE;
测试数据:
192.168.57.4 - - [29/Feb/2016:18:14:35 +0800] "GET /bg-upper.png HTTP/1.1" 304 - 192.168.57.4 - - [29/Feb/2016:18:14:35 +0800] "GET /bg-nav.png HTTP/1.1" 304 -
四、Hive Beeline
解释:
Beeline 要与HiveServer2配合使用
服务端启动hiveserver2
客户的通过beeline两种方式连接到hive
1、beeline -u jdbc:hive2://node03:10000/default -n root
2、beeline
beeline> !connect jdbc:hive2://:/;auth=noSasl root 123
默认 用户名、密码不验证
首先启动hiveserver2,进入到hive的bin下 ,启动hiveserver2文件。则开始服务。
然后,在客户端,beeline -u jdbc;hive2://node03:10000 root 启动beeline客户端。
五、Hive 函数
六、UDF 开发
1、UDF函数可以直接应用于select语句,对查询结构做格式化处理后,再输出内容。 2、编写UDF函数的时候需要注意一下几点: a)自定义UDF需要继承org.apache.hadoop.hive.ql.UDF。 b)需要实现evaluate函数,evaluate函数支持重载。 3、步骤 a)把程序打包放到目标机器上去; b)进入hive客户端,添加jar包:hive>add jar /run/jar/udf_test.jar; c)创建临时函数:hive>CREATE TEMPORARY FUNCTION add_example AS 'hive.udf.Add'; d)查询HQL语句: SELECT add_example(8, 9) FROM scores; SELECT add_example(scores.math, scores.art) FROM scores; SELECT add_example(6, 7, 8, 6.8) FROM scores; e)销毁临时函数:hive> DROP TEMPORARY FUNCTION add_example;
六、 UDAF 自定义聚集函数
多行进一行出,如sum()、min(),用在group by时
1.必须继承
org.apache.hadoop.hive.ql.exec.UDAF(函数类继承)
org.apache.hadoop.hive.ql.exec.UDAFEvaluator(内部类Evaluator实现UDAFEvaluator接口)
2.Evaluator需要实现 init、iterate、terminatePartial、merge、terminate这几个函数
init():类似于构造函数,用于UDAF的初始化
iterate():接收传入的参数,并进行内部的轮转,返回boolean
terminatePartial():无参数,其为iterate函数轮转结束后,返回轮转数据,类似于hadoop的Combiner
merge():接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean
terminate():返回最终的聚集函数结果
开发一个功能同:
Oracle的wm_concat()函数
Mysql的group_concat()
六、UDTF 用户定义表生成函数
操作作用于单个数据行,并且产生多个数据行——-一个表作为输出
如对本文有疑问, 点击进行留言回复!!
网友评论