Hive编程指南01
命令行界面操作
1.Hive中"一次使用"命令
(1)用户可能有时期望执行一个或多个查询(使用分号分割),执行完毕后hive CLI立即退出。-e 选项可以实现这样的功能。
[root@hadoop01 ~]# hive -e "SELECT * FROM emp LIMIT 3";
Logging initialized using configuration in file:/opt/modules/apache/hive-1.2.1/conf/hive-log4j.properties
OK
emp.empno emp.ename emp.job emp.mgr emp.hiredate emp.sal emp.comm emp.deptno
1234 JACK CLERK 7856 1998-2-23 1300.0 NULL 50
7369 SMITH CLERK 7902 1980-12-17 800.0 NULL 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.0 300.0 30
Time taken: 2.014 seconds, Fetched: 3 row(s)
[root@hadoop01 ~]#
(2)-S 选项可以开启静默模式,这样可以在输出结果中去掉"OK" 和 “Time taken” 等行,以及其他一些无关紧要的输出信息。
[root@hadoop01 ~]# hive -S -e "SELECT * FROM emp LIMIT 5";
emp.empno emp.ename emp.job emp.mgr emp.hiredate emp.sal emp.comm emp.deptno
1234 JACK CLERK 7856 1998-2-23 1300.0 NULL 50
7369 SMITH CLERK 7902 1980-12-17 800.0 NULL 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.0 300.0 30
7521 WARD SALESMAN 7698 1981-2-22 1250.0 500.0 30
7566 JONES MANAGER 7839 1981-4-2 2975.0 NULL 20
[root@hadoop01 ~]# hive -S -e "SELECT * FROM emp LIMIT 5" >> /root/temp.txt
[root@hadoop01 ~]# cat temp.txt
emp.empno emp.ename emp.job emp.mgr emp.hiredate emp.sal emp.comm emp.deptno
1234 JACK CLERK 7856 1998-2-23 1300.0 NULL 50
7369 SMITH CLERK 7902 1980-12-17 800.0 NULL 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.0 300.0 30
7521 WARD SALESMAN 7698 1981-2-22 1250.0 500.0 30
7566 JONES MANAGER 7839 1981-4-2 2975.0 NULL 20
(3)获取set 属性值与set 属性名小技巧
[root@hadoop01 ~]# hive -S -e "set" | grep warehouse
hive.metastore.warehouse.dir=/user/hive/warehouse
hive.warehouse.subdir.inherit.perms=true
2.从文件中执行Hive查询
(1)Hive中可以使用 -f 文件名 方式执行指定文件中的一个或多个查询语句,按照惯例,一般把这些Hive查询文件保存为具有.q或者.hql后缀名的文件
[root@hadoop01 ~]# cat test.hql
INSERT INTO TABLE emp VALUES(7564,'NIKE','SALESMAN',7432,'1999-12-20',1500.00,600.00,30);
INSERT INTO TABLE emp VALUES(7897,'JACKSON','SALESMAN',7750,'1995-4-24',13500.00,500.00,30);
SELECT * FROM emp;
[root@hadoop01 ~]# hive -S -f /root/test.hql
_col0 _col1 _col2 _col3 _col4 _col5 _col6 _col7
_col0 _col1 _col2 _col3 _col4 _col5 _col6 _col7
emp.empno emp.ename emp.job emp.mgr emp.hiredate emp.sal emp.comm emp.deptno
1234 JACK CLERK 7856 1998-2-23 1300.0 NULL 50
7369 JACK SALESMAN 7698 1981-2-20 1600.0 300.0 30
7724 WILLAM SALESMAN 7750 1991-3-11 1750.0 300.0 30
7564 NIKE SALESMAN 7432 1999-12-20 1500.0 600.0 30
7897 JACKSON SALESMAN 7750 1995-4-24 13500.0 500.0 30
7369 SMITH CLERK 7902 1980-12-17 800.0 NULL 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.0 300.0 30
7521 WARD SALESMAN 7698 1981-2-22 1250.0 500.0 30
7566 JONES MANAGER 7839 1981-4-2 2975.0 NULL 20
7654 MARTIN SALESMAN 7698 1981-9-28 1250.0 1400.0 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.0 NULL 30
7782 CLARK MANAGER 7839 1981-6-9 2450.0 NULL 10
7788 SCOTT ANALYST 7566 1987-4-19 3000.0 NULL 20
7839 KING PRESIDENT NULL 1981-11-17 5000.0 NULL 10
7844 TURNER SALESMAN 7698 1981-9-8 1500.0 0.0 30
7876 ADAMS CLERK 7788 1987-5-23 1100.0 NULL 20
7900 JAMES CLERK 7698 1981-12-3 950.0 NULL 30
7902 FORD ANALYST 7566 1981-12-3 3000.0 NULL 20
7934 MILLER CLERK 7782 1982-1-23 1300.0 NULL 10
(2)在Hive shell 中用户可以使用SOURCE命令来执行一个脚本文件。
[root@hadoop01 ~]# cat test.hql
SELECT * FROM emp LIMIT 5;
[root@hadoop01 ~]# hive
Logging initialized using configuration in file:/opt/modules/apache/hive-1.2.1/conf/hive-log4j.properties
hive (default)> SOURCE /root/test.hql
> ;
OK
emp.empno emp.ename emp.job emp.mgr emp.hiredate emp.sal emp.comm emp.deptno
1234 JACK CLERK 7856 1998-2-23 1300.0 NULL 50
7369 JACK SALESMAN 7698 1981-2-20 1600.0 300.0 30
7724 WILLAM SALESMAN 7750 1991-3-11 1750.0 300.0 30
7564 NIKE SALESMAN 7432 1999-12-20 1500.0 600.0 30
7897 JACKSON SALESMAN 7750 1995-4-24 13500.0 500.0 30
Time taken: 1.082 seconds, Fetched: 5 row(s)
3.hiverc文件
-i 文件名 选项允许用户指定一个文件,当CLI启动时,在提示符出现前会先执行这个文件。(待再次考证)hive会自动在HOME(当前用户家目录)目录下寻找名为.hiverc的文件,而且会自动执行这个文件中的命令。
对于用户需要频繁执行的命令,使用这个文件时非常方便的。例如:设置系统属性,或者增加对于Hadoop的分布式内存进行自定义的hive扩展的Java包(JAR文件)。
$HIVE_HOME/.hiverc
ADD JAR /path/to/custom_hive_extensions.jar;
set hive.cli.print.current.db=true;
set hive.exec.mode.local.auto=true;
4.Hive CLI的其他功能
(1)自动补全功能
如果在输入的过程中敲击tab键,那么CLI会自动补全而可能的关键字或者函数名。
(2)查看操作历史命令
Hive会将最近的10000行命令记录到文件$ HIVE_HOME/.hivehistory中。
Tips:大多数导航按键使用的Control+字母和bash shell中是相同的:
- Control+A:移动光标到行首
- Control+B:移动光标到行尾
5.执行shell命令
用户不需要退出hive CLI就可以执行简单的bash shell命令。只需要在命令前加上!并且以分号(;)结尾就可以。
hive (default)> !ls;
temp.txt
test.hql
hive (default)> !pwd;
/root
Hive CLI中不能使用需要用户进行交互式命令,而且不支持shell的管道功能和文件的自动补全功能。
6.在Hive内使用Hadoop的dfs命令
用户可以在Hive CLI中执行Hadoop的dfs…命令,只需要将hadoop命令中关键字hdfs去掉,然后以分号结尾就可以了。
hive (default)> dfs -ls /user/hive/warehouse;
Found 11 items
drwxrwxr-x - root supergroup 0 2019-06-14 02:49 /user/hive/warehouse/db_emp.db
drwxrwxr-x - root supergroup 0 2019-06-16 01:09 /user/hive/warehouse/dept
drwxrwxr-x - root supergroup 0 2019-06-14 02:39 /user/hive/warehouse/dept_exter
drwxrwxr-x - root supergroup 0 2019-06-16 12:59 /user/hive/warehouse/emp
drwxrwxr-x - root supergroup 0 2019-06-11 04:03 /user/hive/warehouse/emp_bu
drwxrwxr-x - root supergroup 0 2019-06-14 03:38 /user/hive/warehouse/emp_bu01
drwxrwxr-x - root supergroup 0 2019-06-14 03:39 /user/hive/warehouse/emp_buck
drwxrwxr-x - root supergroup 0 2019-06-09 14:40 /user/hive/warehouse/ha01
drwxrwxr-x - root supergroup 0 2019-06-09 16:12 /user/hive/warehouse/ha02
drwxrwxr-x - root supergroup 0 2019-06-10 23:32 /user/hive/warehouse/student
drwxrwxr-x - root supergroup 0 2019-06-10 23:42 /user/hive/warehouse/student01
[root@hadoop01 hive-1.2.1]# hdfs dfs -ls /user/hive/warehouse
Found 11 items
drwxrwxr-x - root supergroup 0 2019-06-14 02:49 /user/hive/warehouse/db_emp.db
drwxrwxr-x - root supergroup 0 2019-06-16 01:09 /user/hive/warehouse/dept
drwxrwxr-x - root supergroup 0 2019-06-14 02:39 /user/hive/warehouse/dept_exter
drwxrwxr-x - root supergroup 0 2019-06-16 12:59 /user/hive/warehouse/emp
drwxrwxr-x - root supergroup 0 2019-06-11 04:03 /user/hive/warehouse/emp_bu
drwxrwxr-x - root supergroup 0 2019-06-14 03:38 /user/hive/warehouse/emp_bu01
drwxrwxr-x - root supergroup 0 2019-06-14 03:39 /user/hive/warehouse/emp_buck
drwxrwxr-x - root supergroup 0 2019-06-09 14:40 /user/hive/warehouse/ha01
drwxrwxr-x - root supergroup 0 2019-06-09 16:12 /user/hive/warehouse/ha02
drwxrwxr-x - root supergroup 0 2019-06-10 23:32 /user/hive/warehouse/student
drwxrwxr-x - root supergroup 0 2019-06-10 23:42 /user/hive/warehouse/student01
这种使用hadoop命令的方式实际上比与等价的在bash shell中hdfs dfs…命令更为高效。因为后者每次都会启动一个新的JVM实例,而hive会在同一个进程中执行这些命令。
7.Hive脚本中如何进行注释
用户可以使用以–开头的字符串来表示注释
--hql query
--This is the best Hive script evar!!
SELECT * FROM emp LIMIT 5
8.显示字段名称
通过设置hiveconf配置项hive.cli.print.header为true来开启这个功能
[root@hadoop01 ~]# cat .hiverc
set hive.cli.print.current.db=true;
set hive.cli.print.header=true;
数据类型和文件格式
1.基本数据类型
数据类型 | 长度 | 栗子 |
---|---|---|
TINYINT | 1byte有符号数 | 20 |
SMALINT | 2byte有符号数 | 20 |
INT | 4byte有符号数 | 20 |
BIGINT | 8byte有符号数 | 20 |
BOOLEAN | 布尔类型,true或者false | TRUE |
FLOAT | 单精度浮点数 | 3.14159 |
DOUBLE | 双精度浮点数 | 3.14159 |
STRING | 字符序列。可以指定字符集。可以使用单引号或者双引号 | ‘alex’,“johnson” |
TIMESTAMP | 整数,浮点数或者字符串 | 13854848(Unix新纪元秒),1584125.415645(Unix新纪元秒,带有纳秒数),‘2019-07-16 12:34:24.123456789’(JDBC所兼容的java.sql.Timestamp时间格式) |
BINARY | 字节数组 |
2.集合数据类型
数据类型 | 描述 | 示例 |
---|---|---|
STRUST | 类C语言的struct或者“对象”,都可以通过点“.”符号访问元素内容,STRUCT{first STRING,last String},那么第一个元素可以通过字段名.first来引用。 | struct(‘alex’,‘mike’) |
MAP | MAP是一组键值对元素集合,使用数组表示法(例如[‘key’])可以访问元素。 | map(‘first’,‘john’,‘last’,‘white’) |
ARRAY | 数组是一组具有相同数据类型和名称的变量的集合,数组下标从0开始 | Array(‘John’,‘Joe’) |
CREATE TABLE employees(
name STRING,
salary DOUBLE,
subordinates ARRAY<STRING>,
deductions MAP<STRING,FLOAT>,
address STRUCT<street:STRING,city:STRING,state:STRING,zip:INT>);
)
hive (default)> show create table employees;
OK
createtab_stmt
CREATE TABLE `employees`(
`name` string,
`salary` double,
`subordinates` array<string>,
`deductions` map<string,float>,
`address` struct<street:string,city:string,state:string,zip:int>)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'hdfs://hadoop01:8020/user/hive/warehouse/employees'
TBLPROPERTIES (
'transient_lastDdlTime'='1560666188')
Time taken: 0.149 seconds, Fetched: 16 row(s)
3.文本文件数据编码
分隔符 | 描述 |
---|---|
\n | 对于文本文件来说,每行都是一条记录,因此换行符可以分割记录 |
^A(ctrl+v,ctrl+a) | 用于分隔字段(列),在CREATE TABLE语句中可以使用八进制编码\001表示 |
^B(ctrl+v,ctrl+b) | 用于分隔ARRAY或者STRUCT中的元素,或用于MAP中键-值对之间的分隔。在CREATE TABLE语句中可以使用八进制编码\002表示 |
^C(ctrl+v,ctrl+c) | 用于MAP中键和值之间的分隔。在CREATE TABLE语句中可以使用八进制编码\003表示 |
John Doe^A100000.0^AMary Smith^BTodd Jones^AFederal Taxes^C.2^BStateTaxes^C.05^BInsurance^C.1^A1 Michigan Ave.^BChicago^BIL^B60600
Mary Smith^A80000.0^ABill King^AFederal Taxes^C.2^BStateTaxes^C.05^BInsurance^C.1^A100 Ontario St.^BChicago^BIL^B60601
Todd Jones^A70000.0^A^AFederal Taxes^C.15^BStateTaxes^C.03^BInsurance^C.1^A200 Chicago Ave.^BOak Park^BIL^B60700
Bill King^A60000.0^A^AFederal Taxes^C.15^BStateTaxes^C.03^BInsurance^C.1^A300 Obscure Dr.^BObscuria^BIL^B60100
CREATE TABLE employees(
name STRING,
salary DOUBLE,
subordinates ARRAY<STRING>,
deductions MAP<STRING,FLOAT>,
address STRUCT<street:STRING,city:STRING,state:STRING,zip:INT>)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
COLLECTION ITEMS TERMINATED BY '\002'
MAP KEYS TERMINATED BY '\003'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
hive (default)> desc formatted employees;
OK
col_name data_type comment
# col_name data_type comment
name string
salary double
sub