Hive所有数据类型分为两种:
类型 | 描述 | 示例 |
---|---|---|
boolean | true/false | true |
tinyint | 1字节的有符号整数 | -127~128 |
smallint | 2个字节的有符号整数,-32768~32767 | 1S |
int | 4个字节的带符号整数 | 1 |
bigint | 8字节带符号整数 | 1L |
float | 4字节单精度浮点数 | 1.0 |
double | 8字节单精度浮点数 | 1.0 |
deicimal | 任意精度的带符号小数 | 1.0 |
string | 字符串,变长 | “a”,‘b’ |
varchar | 变长字符串 | “a”,‘b’ |
char | 固定长度字符串 | “a”,‘b’ |
binary | 字节数组 | |
timestamp | 时间戳,纳秒精度 | |
date | 日期 | ‘2018-04-07’ |
类型 | 描述 | 示例 |
---|---|---|
array | 有序的的同类型的集合 | array(1,2) |
map | key-value:key必须为原始类型,value可以任意类型 | map(‘a’,1,’b’,2) |
struct | 字段集合,类型可以不同 | struct(‘1’,1,1.0), named_stract(‘col1’,’1’,’col2’,1,’clo3’,1.0) |
Hive会为每个创建的数据库在HDFS上创建一个目录,该数据库的表会以子目录形式存储,表中的数据会以表目录下的文件形式存储。对于default数据库,默认的缺省数据库没有自己的目录,default数据库下的表默认存放在/user/hive/warehouse目录下。
textfile为默认格式,存储方式为行存储。数据不做压缩,磁盘开销大,数据解析开销大。
SequenceFile是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。
SequenceFile支持三种压缩选择:NONE, RECORD, BLOCK。 Record压缩率低,一般建议使用BLOCK压缩。
一种行列存储相结合的存储方式。
数据按照行分块,每个块按照列存储,其中每个块都存储有一个索引。hive给出的新格式,属于RCFILE的升级版,性能有大幅度提升,而且数据可以压缩存储,压缩快 快速列存取。
Parquet也是一种列式存储,同时具有很好的压缩性能;同时可以减少大量的表扫描和反序列化的时间。
-- 创建数据库语法:
CREATE DATABASE IF NOT EXISTS database_name;
--例如:
CREATE DATABASE IF NOT EXISTS userdb;
-- 删除数据库语法:
DROP DATABASE StatementDROP (DATABASE|SCHEMA) [IF EXISTS] database_name;
-- 例如:
DROP DATABASE IF EXISTS userdb;
-- 进入数据库
USE database_name;
SHOW TABLES;
DROP TABLE [IF EXISTS] table_name;
SHOW CREATE TABLE table_name;
SHOW PARTITION table_name;
-- 内部表转外部表
ALTER TABLE table_name SET TBLPROPERTIES ('EXTERNAL'='TRUE');
-- 外部表转内部表
ALTER TABLE table_name SET TBLPROPERTIES ('EXTERNAL'='FALSE');
ALTER TABLE table_name RENAME TO new_table_name;
ALTER TABLE table_name ADD COLUMNS (cloumn_name string);
ALTER TABLE name DROP [COLUMN] column_name;
ALTER TABLE name CHANGE column_name new_name new_type;
ALTER TABLE table_name DROP IF EXISTS PARTITION(day=); -- 这里分区是day
-- 分区字段包含:p_hour,p_city,p_loctype
ALTER TABLE table_name IF NOT EXISTS \
ADD PARTITION (p_hour='2017113003', p_city='573', p_loctype='MHA');
-- 修改location
ALTER TABLE table_name SET LOCATION "new_location_name";
-- partition修改location路径
ALTER TABLE table_name PARTITION (dt='2008-08-08') SET LOCATION "new_location_name";
-- 修改分区名
ALTER TABLE table_name PARTITION (dt='2008-08-08') RENAME TO PARTITION (dt='20080808');
语法:
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[ROW FORMAT row_format]
[STORED AS file_format]
举例:
CREATE TABLE IF NOT EXISTS employee ( eid int, name String,
salary String, destination String)
COMMENT ‘Employee details’
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t’
LINES TERMINATED BY ‘\n’
STORED AS TEXTFILE;
语法如下:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
-- 说明:
LOCAL是标识符指定本地路径。它是可选的。
OVERWRITE 是可选的,覆盖表中的数据
PARTITION 这是可选的
参数描述:
例如:
load data local inpath '/opt/test/emp.txt' \
into table emp_part partition (year='2016', month='3');
-- 创建表时加载
CREATE TABLE table_name (year string, temperature int) \
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOAD DATA LOCAL INPATH 'xxx/input.txt' \
OVERWRITE INTO TABLE table_name;
-- 创建表时加载
CREATE TABLE table_name (year string, temperature int) \
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' \
LOAD DATA INPATH '/emp.txt' INTO TABLE table_name partition (year='2016', month='6');
描述:
create table 表名 as sql
举例:
create table meiying_rate as \
select a.pkg_name,b.installed-b.uninstall,a.rank from yinyl.meiying_applist a left outer join user.user_app_stat_daily b \
on a.pkg_name=b.packageid \
where b.day=20151101 and a.rank<=100000 \
order by a.rank;
描述:
insert overwrite local directory ‘路径’ row format delimited fields terminated by ‘|’ sql
举例:
-- 第一种方式
insert overwrite local directory '${dir_in}rate_${DATE}/' \
row format delimited fields terminated by '|' 、
select a.pkg_name,b.installed-b.uninstall,a.rank from yinyl.meiying_applist a left outer join user.user_app_stat_daily b on a.pkg_name=b.packageid where b.day=${DATE} and a.rank<=100000 order by a.rank;
-- 第二种方式
hive>
hive -e 'select * from testdb2.emp' >> ./emp_export.txt
insert overwrite directory '${dir_in}rate_${DATE}/' \
row format delimited fields terminated by '|' 、
select a.pkg_name,b.installed-b.uninstall,a.rank from yinyl.meiying_applist a left outer join user.user_app_stat_daily b on a.pkg_name=b.packageid where b.day=${DATE} and a.rank<=100000 order by a.rank;
select from 表a right(left) outer join 表b on 条件 where
create table diff_in_bj_idc_mangguo as SELECT BB.uid FROM (SELECT dw_user_lastlogin.uid FROM report_dw_mdp.dw_user_lastlogin where dw_user_lastlogin.day=20151028 and dw_user_lastlogin.app_id ='X0LuNCmE6t6VuvA1b3EyW4') AA RIGHT OUTER JOIN (SELECT user_bj_idc_20151028.uid FROM yuankai.user_bj_idc_20151028) BB ON (AA.uid= BB.uid) WHERE AA.uid IS NULL;
去重:distinct
分组:group by
排序:order by (若有where放在其后)
hive>hive -e “insert overwrite local directory ‘${dir_in}rate_${DATE}/’ row format delimited fields terminated by ‘|’ select a.pkg_name,b.installed-b.uninstall,a.rank from yinyl.meiying_applist a left outer join user.user_app_stat_daily b on a.pkg_name=b.packageid where b.day=${DATE} and a.rank<=100000 order by a.rank”
上述实例,创建表时,使用外部表,否则删除表时,会将原始数据删掉;