标签:device def storage enter 数据平台 长度 命令 入门 lower
本手册介绍了hive的基本知识及工作中要注意的要点,适用于hive入门.开发人员请关注hive表操作以及UDF.
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。
当前用sqoop导入的数据都是内部表.
hive支持分区表,在查询时指定分区字段可以过滤无用分区.分为静态分区和动态分区.
静态分区:
静态分区:指手动创建的分区.在创建表时需要额外
指定分区键,如:
create external table if not exists cheap_hotel_user(device string, booking_freq int, book_price string) partitioned by (day string);
或者通过alter table来添加分区:
ALTER TABLE table_name ADD PARTITION (partCol = ‘value1‘) location ‘loc1‘;
动态分区:
动态分区:可以根据指定字段的值自动创建分区(参考ORACLE的数据自动插入到对应分区).默认不开启动态分区,需要修改参数hive.exec.dynamic.partition实现,动态分区上限为10000个.
\001
.在建表时可以指定,如:FIELDS TERMINATED BY ‘\036‘.
注意:不要写成‘\0X1E‘.\n
,不可更改.Text File\SequenceFile\RCFile\Avro Files\ORC Files\Parquet
以及自定义文件类型.当前使用的是ORC
格式.ORC
格式是一种高性能的带压缩的文件格式,支持多种特性,甚至支持hive的update操作.建表时指定文件格式:"STORED AS ORC
". [点此了解hive文件格式]类型 | 长度 | 示例 |
---|---|---|
tinyint | 1byte有符号整数 | 20 |
smallint | 2byte有符号整数 | 20 |
int | 4byte有符号整数 | 20 |
bigint | 8byte有符号整数 | 20 |
boolean | 布尔类型,true or flase | TRUE |
float | 单精度浮点数 | 3.14159 |
double | 双精度浮点数 | 3.1415923 |
string | 字符.可以指定字符集,用引号或又引号 | ‘中国‘ "中国" |
date | 日期类型 | ‘2017-03-06‘ |
timestamp | 时间戳.整数 浮点(带纳秒)数或字符串. | 122327493795.123456789 |
类型 | 长度 | 示例 |
---|---|---|
struct | 类似C语言中的结构体 | 如果类型为struct(name string,age int),则可存的值可为 struct(‘bijr‘,3) |
map | 键值对应的组合 | map(k1,v1,k2,v2) |
array | 数组,和java数组一样 | array(‘a‘,‘b‘,‘c‘) |
union | 存储指定类型中的一个或多个 | union(string,int,date)->union(1,‘2017-03-06‘) |
注意:表时不要使用HIVE关键字.
NULL代表该字段值是空缺的,查询时显示为‘NULL‘,底层存储为‘\N‘.像其它数据库一样,可以用IS (NOT) NULL来查询.
创建数据库
create database [IF NOT EXISTS] simple;
查看数据库
show databases;
删除数据库
drop database [IF EXISTS] simple;
选择数据
use simple;
创建内部表
create table [IF NOT EXISTS] test(id int,name string, age int,dt date)
[ROW FORMAT DELIMITED]
[FIELDS TERMINATED BY ‘\001‘]
STORED AS ORC [LOCATION ‘/user/hive/SIMPLE/test‘] ;
创建外部表
create
EXTERNAL
table [IF NOT EXISTS] test2(id int,name string, age int,dt date)
FIELDS TERMINATED BY ‘\001‘
LOCATION ‘/tmp/test2‘ ;
注意:在外部表中,location是必须的,分隔符根据文件而定.
创建分区表
CREATE TABLE XDGL_HIS.FLOW_OPINION_ARCH(
serialno string,
opinionno string,
objecttype string
createtime string,
etl_in_dt string)
PARTITIONED BY ( p_day string)
ROW FORMAT DELIMITED
STORED AS ORC
LOCATION ‘/user/hive/S4/CRM_SERVICE_TYPE‘ ;
设置动态分区
set hive.exec.dynamic.partition=true;
查看表分区
show partitions XDGL_HIS.FLOW_OPINION_ARCH;
动态分区分区个数默认上限为10000.
从一个表创建另一个表,只创建表结构
create table test2 like test;
create table tests as select * from test where 1=2;
查看表信息
desc test;
desc extended test;
desc formatted test;
ALTER TABLE test RENAME TO testtest;
查询数据
select name,age from test where id =2;
select * from test where id =2;
查询表时,只查需要的列,不要用select *,这样可以减少处理的数据量优化查询速度.
删除数据
delete from test where id=2;
增加列
ALTER TABLE test ADD COLUMNS (c1 INT);
注意:增加字段只会在现在有字段后面添加字段.
ALTER TABLE test REPLACE COLUMNS (
id int,
name string,
age int,
dt date
);
这样就删除掉了c1字段,实际上并未修改HDFS上的文件.
alter table test change c1 c2 bigint;
同时修改了字段名和类型.
视图将查询结果展示给用户,可以屏蔽无用数据.
create view as
select course, teacher, building
from teaches, teacher_table
where teaches.teacher_id = teacher_table.teacher_id
and teaches.dept_name = ‘CS‘
视图中并不存放数据,只存放元数据.视图在每次被select时都会执行计算,因此可能比较慢.如果不需要实时数据,可以将视图替换会为实体表.
注意:某些组件无法使用hive的视图,比如presto.
insert inito test values(1,‘yangxw‘,20,‘2017-03-07‘);
插入单条数据create table test2 likie test;
insert into test2 select id,name,age,dt from test;
从一个表向另外一个表插入数据insert overwrite table test2 select id,name,age,dt from test;
从一个表向另外一个表插入数据,覆盖原表数据insert overwrite table XDGL_HIS.FLOW_OPINION_ARCH partition(p_day = 2016)
select serialno,opinionno,objecttype,createtime,etl_in_dt from FLOW_OPINION_ARCH_tmp;
覆盖指定分区.
注意:
1.新的hive版本支持insert into value()方式插入单条数据,但速度极慢,可做为测试用.
2.使用insert select 方式插入数据,必须对目标表的所有列提供数据,即不能只对指定列插入数据.如:不支持insert into test2(id ,name) select id,name from test这样.
LOAD DATA [LOCAL] INPATH ‘filepath‘ [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 …)]
加上LOCAL时代表是从本地加载文件,不带LOCAL是从HDFS加载文件.
hive扩展语法(一次插入多表)
FROM from_statement
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 …) [IF NOT EXISTS]] select_statement1
[INSERT OVERWRITE TABLE tablename2 [PARTITION … [IF NOT EXISTS]] select_statement2]
[INSERT INTO TABLE tablename2 [PARTITION …] select_statement2] …;
注意:如果导入的源文件是文本格式,则要替换文本中的 \r \n,否则在hive 的客户端工具中会显示异常.解决办法:导出源文件的脚本中替换\r \n,例如在oracle导出脚本中replace(colun_name,char(10),‘ ‘),replace(colun_name,char(10),‘ ‘)
INSERT OVERWRITE [LOCAL] DIRECTORY directory1
[ROW FORMAT row_format] [**STORED AS file_format**] (Note: Only available starting with Hive 0.11.0)
SELECT … FROM …
hive扩展语法(导入到多个目录)
FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2] …
支持导出的文件格式:
DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
[NULL DEFINED AS char] (Note: Only available starting with Hive 0.13)
LOCAL时数据导出到本地,不使用LOCAL时导出到HDFS.字段分隔符是 ^A.
sqoop import --connect jdbc:oracle:thin:@//${db_ipaddr}/${db_schema} --username ${db_username} --password ‘${db_passwd}‘ --query " select SERIALNO, OBJECTTYPE, OBJECTNO, FEETYPE, to_char(SYNCHDATE, ‘YYYY-MM-DD HH24:mi:ss‘) as SYNCHDATE from XDGL.ACCT_FEE_ARCH where SYNCHDATE > (TO_DATE(‘${DAY}‘, ‘YYYY-MM-DD‘) -1) and $CONDITIONS " --hcatalog-database STAGE --hcatalog-table ACCT_FEE_ARCH --hcatalog-storage-stanza ‘stored as ORC‘ --hive-partition-key p_day --hive-partition-value ${DAY} --hive-delims-replacement " " -m 1
当前从其它系统同步到大数据平台时,加了ETL_IN_DATE字段来标识导入时间.
注意:使用JDBC导入到hive中时,要替换文本中的 \r \n,否则在hive 的客户端工具中会显示异常.解决办法:导出源文件的脚本中替换\r \n,例如在oracle导出脚本中replace(colun_name,char(10),‘ ‘),replace(colun_name,char(10),‘ ‘)
1. `sqoop export --table tableName2 \ #oracle表`
2. `--connect jdbc:oracle:thin:@127.0.0.1:1521:ORCL \`
3. `--username username \ #oracle用户`
4. `--password password \ #密码`
5. `--hcatalog-database DB1 \ #catalog数据库`
6. `--hcatalog-table tableName2 \ #catalog表`
7. `--hcatalog-partition-keys p_month \ #`
8. `--hcatalog-partition-values 2016-11 \`
9. `--columns "serialno",\`
10. `"contractstatus",\`
11. `"rno",\`
12. `"rname",\`
13. `"stores",\`
14. `"sname",\`
15. `"etl_in_dt"`
hsql的语法和mysql很像,.
大多数时候都可以像使用mysql一样使用hive,以下只列出要注意的地方.
点击查看hive用户手册
点击查看hive select语句文档
SELECT [ALL | DISTINCT] select_expr, select_expr, …
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list [HAVING condition]]
[ CLUSTER BY col_list
| [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]
]
[LIMIT number]
group by,Order by, Sort by, Cluster by, and Distribute By
group by
和其它数据库的group by是一样的
select sum(amt),city from pos group by city;
order by[aes|desc] [nulls last|nulls first]
对数据做全局排序.因所全局排序,所以只有一个reduce处理数据.
注意:hive中order by 时null值是"最小"的,而oracle中order by 时null值是"最大"的
hive:
hive> select * from tnull order by c ;
2 NULL
1 a
hive> select * from tnull order by c desc;
1 a
2 NULL
oracle:
SQL> select * from tnull order by c ;
ID C
1 aa
2
SQL> select * from tnull order by c desc;
ID C
2
1 aa
sort by
sort by 是在map数据传给reduce之前排序,只能保证map内有序,不能保证全局有序.
Distribute By 功能.
控制map数据如果分发给reduce,默认是hash方式.常和sort by 一起使用.
Cluster by
同时具有有 sort by \Distribute By 功能.
>SELECT … FROM (subquery) AS name … #from子查询
>SELECT * #where in
>FROM A
>WHERE A.a IN (SELECT foo FROM B);
>SELECT A #where exits(旧版本可能不支持)
>FROM T1
>WHERE EXISTS (SELECT B FROM T2 WHERE T1.X = T2.Y);
注意:hive不支持嵌套子查询,可以改成join来完成
select (select adress from b where b.userid=a.userid) adress from a.
hive内置函数包括:操作符\字符串函数\数学函数\日期函数\分析函数(窗口函数)等.具体参考文档.
点击查看hive内置函数
点击查看hive分析函数
点击查看hive插件开发
创建自定义函数要使用UDF接口:
package com.example.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public final class Lower extends UDF {
public Text evaluate(final Text s) {
if (s == null) { return null; }
return new Text(s.toString().toLowerCase());
}
}
hive中计算的数据往往是巨大的,hive的函数按行数处理,因此不要在自定义函数中再嵌入循环之类的操作,如用jdbc查询另外一个数据库等。
Add jars
把函数相关的jar包加入到hive中,然后注册:CREATE TEMPORARY FUNCTION function_name AS class_name;
DROP TEMPORARY FUNCTION [IF EXISTS] function_name;
eg:
[hive@hadoop2 ~]$ add jar /path/to/lower.jar
hive>create temporary function xxoo_lower as ‘test.ql.LowerUDF‘;
注意:临时函数只在当前session有效,关了这个会话就没了。
要把jar放到hdfs上
CREATE FUNCTION [db_name.]function_name AS class_name
[USING JAR|FILE|ARCHIVE ``‘file_uri‘` `[, JAR|FILE|ARCHIVE ``‘file_uri‘``] ];
DROP TEMPORARY FUNCTION [IF EXISTS] function_name;
eg:
hdfs dfs -put lower.jar ‘hdfs:///path/to/hive_func‘;
hive> create function xxoo_lower as ‘test.ql.LowerUDF‘ using jar ‘hdfs:///path/to/hive_func/lower.jar‘
默认情况下,hive没有开启权限控制,想要开启权限控制需要设置一些参数.
hive权限的详细操作
hive的权限角色分为:
拥有相应权限并且有WITH ADMIN OPTION
权限的用户可以授权给别人.比如A用户在表t上有select权限,并且有WITH ADMIN OPTION
权限,那么可以授权给B用户查询t表的权限:
grant select on testdb.test to user B;
CREATE ROLE role_name
DROP ROLE role_name
GRANT ROLE role_name [, role_name] …
TO principal_specification [, principal_specification] …
[WITH ADMIN OPTION]
REVOKE [ADMIN OPTION FOR] ROLE role_name [, role_name] …
FROM principal_specification [, principal_specification] …
principal_specification:
USER user
| GROUP group
| ROLE role
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] …
[ON object_specification]
TO principal_specification [, principal_specification] …
[WITH GRANT OPTION]
REVOKE [GRANT OPTION FOR]
priv_type [(column_list)]
[, priv_type [(column_list)]] …
[ON object_specification]
FROM principal_specification [, principal_specification] …
REVOKE ALL PRIVILEGES, GRANT OPTION
FROM user [, user] …
priv_type:
ALL | ALTER | UPDATE | CREATE | DROP
| INDEX | LOCK | SELECT | SHOW_DATABASE
object_specification:
TABLE tbl_name
| DATABASE db_name
principal_specification:
USER user
| GROUP group
| ROLE role
SHOW GRANT user|group|role XXX
[ON table|database [(column_list)]]
hive使用的是mapreduce计算框架,因此优化都是围绕mr来做.具体请参考:
点击查看hive 优化官方文档
标签:device def storage enter 数据平台 长度 命令 入门 lower
原文地址:http://www.cnblogs.com/skyrim/p/7455263.html