2.Hive使用
1.1Hive SQL
1.1.1Hive的数据类型
primitive_type
array_type //数组格式
|map_type //map格式
|struct_type //结构体格式
primitive_type
|TINYINT
|SMALLINT
|INT
|BIGINT
|BOOLEAN
|FLOAT
|DOUBLE
|STRING
hive比普通的mysql多了三种基本的数据结构,array,map,struct。
具体使用参考:hive使用手册
hive数据的插入通过使用数据格式化,从hdfs文件中读取,上图后续的代码是格式化读取文件。
LOAD DATA LOCAL INPUT ’/root/data' INTO TABLE psn;加载文件给hive数据表。
1.2Hive分区
1.2.1内部表和外部表
未被external修饰的是内部表(managed table),被external修饰的为外部表(external table)
区别:
内部表数据由Hive自身管理,外部表数据由HDFS管理;
内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定;
删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;
对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)
1.2.2分区(加目录)
Hive 分区partition
必须在表定义时指定对应的partition字段
a、单分区建表语句:
create table day_table (id int, content string) partitioned by (dt string);
单分区表,按天分区,在表结构中存在id,content,dt三列。以dt为文件夹区分
b、双分区建表语句:
create table day_hour_table (id int, content string) partitioned by (dt string, hour string);
双分区表,按天和小时分区,在表结构中新增加了dt和hour两列。先以dt为文件夹,再以hour子文件夹区分
添加分区:AlTER TABLE psn2 ADD partition(age=10,sex='boy')
Hive添加分区表语法
(表已创建,在此基础上添加分区):
ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location1']partition_spec [LOCATION 'location2'] ...;
partition_spec:
: (partition_column = partition_col_value, partition_column = partition_col_value, ...)
例:ALTER TABLE day_table ADD PARTITION (dt='2008-08-08', hour='08')
Hive删除分区语法
ALTER TABLE table_name DROP partition_spec, partition_spec,...partition_spec:
: (partition_column = partition_col_value, partition_column = partition_col_value, ...)
用户可以用ALTER TABLE DROP PARTITION 来删除分区。内部表中、对应分区的元数据和数据将被一并删除。
例:ALTER TABLE day_hour_table DROP PARTITION (dt='2008-08-08',hour='09');
Hive向指定分区添加数据语法
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2...)]
例:LOAD DATA INPATH '/user/pv.txt' INTOTABLE day_hour_table PARTITION(dt='2008-08- 08', hour='08');
LOAD DATA local INPATH '/user/hua/*' INTO TABLE day_hour partition(dt='2010-07- 07');
当数据被加载至表中时,不会对数据进行任何转换。Load操作只是将数据复制至Hive表对应的位置。数据加载时在表下自动创建一个目录
Hive查询执行分区语法
SELECT day_table.* FROM day_table WHERE day_table.dt>= '2008-08-08';
分区表的意义在于优化查询。查询时尽量利用分区字段。如果不使用分区字段,就会全部扫描。
Hive查询表的分区信息语法:SHOW PARTITIONS day_hour_table;
1.2.3加数据(读时检查)
1.直接上传文件到HDFS目录下,一般为/user/hive/warehouse/数据库名/表名/下。
2.通过load data加载本地文件到hdfs目录下。
3.insert into tablename....
FROM psn3 insert overwrite table psn4 select id,name,likes 作用:复制表,中间表等。
1.3Hive SerDe
Hive SerDe - Serializer and Deserializer
1.SerDe 用于做序列化和反序列化。
2.构建在数据存储和执行引擎之间,对两者实现解耦。
3.Hive通过ROW FORMAT DELIMITED以及SERDE进行内容的读写.
row_format:
DELIMITED
[FIELDS TERMINATED BY char [ESCAPEDBY char]]
[COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char]
[LINES TERMINATED BY char]
|SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
Hive正则匹配
CREATE TABLElogtbl (
host STRING,
identity STRING,
t_userSTRING,
time STRING,
request STRING,
refererSTRING,
agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES ( "input.regex"= "([^ ]*) ([^ ]*) ([^ ]*) \\[(.*)\\] \"(.*)\" (-|[0-9]*)
(-|[0-9]*)" ) STORED AS TEXTFILE;
1.4Hive Beeline
Beeline要与HiveServer2配合使用
服务端启动hiveserver2
客户的通过beeline两种方式连接到hive:
1.beeline -u jdbc:hive2://localhost:10000/default -n root
2.beeline
beeline>
!connect jdbc:hive2://<host>:<port>/<db>;auth=noSasl root 123
默认用户名、密码不验证
1.5Hive JDBC
服务端启动hiveserver2后,在java代码中通过调用hive的jdbc访问默认端口10000进行连接、访问。
jdbc访问hive数据库的java代码