2.Hive使用

2019-01-12  本文已影响0人  南宫萧言

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代码
上一篇下一篇

猜你喜欢

热点阅读