变量和参数
客户端中的变量分四个域:
- hivevar (用户自定义)
- hiveconf(hive配置变量)
- env (系统环境变量)
- system (操作系统变量)
hive>set
打印所有域中的相关属性,也可以用set来修改属性值,例如:
1)hive>set env:HADOOP_HOME;
【打印系统环境变量HADOOP_HOME】
结果:env:HADOOP_HOME=/home/hadoop/soft/hadoop
2)hive>set hiveconf:hive.exec.scratchdir;
结果:hiveconf:hive.exec.scratchdir=/tmp/hive
3)hive>set fs.defaultFS;
【set Hadoop属性名,打印出hadoop中的属性值】
结果: fs.defaultFS=hdfs://mycluster
4)$hive -d name=geek
或者 $ hive --define name=geek【在外部定义一个name变量】
hive>set hivevar:name;
或者 hive> set name;【进入hive,打印出name变量的值】
结果:hivevar:name=geek 和 name=geek
hive>set hivevar:name=geekbai;
或者 hive> set name=geekbai;【重置,修改name变量的值】
结果:hivevar:name=geekbai 和 name=geekbai
5)显示当前操作的database数据库
hive>set hiveconf:hive.cli.print.current.db=true;
【设置此属性值为true】
结果例如:hive (default)> use hive_test;【默认是default数据库】
hive (hive_test)>- Hive一次执行命令
$hive -e “select * from student”
【查询student表中所有内容】
$hive -e “insert into t2 values("geekbai",22)”
【向t2表插入一条数据】
$hive -S -e "select * from student" > ~/student.txt
【将查询到的内容写到student.txt文件中】
在文件中执行Sql:
$vi student.hql
【创建一个文件,后缀最好为.hql,好辨认】
select * from student;【写入sql语句】
$hive -f ~/student.hql
【执行文件里的语句】
$ hive -S -f ~/student.hql >> ~/student.txt;【将结果打印到另一文件】
获取客户端的历史Sql语句的命令,在~的.hivehistory下
$ cd ~
$cat .hivehistory
- hiverc文件,在Cli客户端启动时,Hive会自动去HOME目录下找 .hiverc文件,自动执行文件里的命令
$ cd ~ 【最开始是没有这个文件的,要先创建】
$ vi .hiverc 【可以在文件里定义一些变量,设置属性值等等】
set hiveconf:hive.cli.print.current.db=true;
$ hive
hive (default)> - 客户端有自动补全功能,在客户端能执行简单的shell命令,能使用Hadoop的dfs命令
hive > ! pwd;
hive > ! clear;
hive > dfs -ls / ;
hive > dfs -help;【查看所有功能选项列表】 - 设置查询显示列名
hive>set hive.cli.print.header=true;
【或者直接在 .hiverc文件中设置该属性值】
hive>select * from student;
结果为:student.id student.name student.age
1 zhangsan 22
默认的文本文件数据编码
- 行按照 '\n‘ 进行分割
- 字段按照 ‘\A’ 【\001】进行分割
- Array和Struct按照 ‘\B’ 【\002】进行分割
- Map按照’ \C’ 【\003】进行分割
语法(字符串默认情况下):
create table employees(
name string,
salary float,
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';
简单案例:
1)创建stu_data文件,含有三个字段,字段采用“,”逗号进行分割
1,geekbai,22
2,geekdragon,23
3,geekwei,11
4,geekwhite,10
5,geekyellow,15
6,geekblack,18
7 geekred,20
8 geekblue 30
2)hive中的建表语句如下:
create table student (id int,name string,age int)
row format delimited
fields terminated by ','
lines terminated by '\n';
3)将数据文件上传至hive的数据仓库中
方法1:
hive (hive_test)> load data local inpath '/home/dragon/stu_data' into table student;
【在客户端上传】
如果数据文件已经在集群hdfs上,就不用加 local
方法2:
$ hadoop fs -put ~/stu_data /user/hive/warehouse/hive_test.db/student/
【直接暴力上传到hdfs】
4)进入Cli客户端查寻结果
$>hive
hive> select * from student;
student.id student.name student.age
1 geekbai 22
2 geekdragon 23
3 geekwei 11
4 geekwhite 10
5 geekyellow 15
6 geekblack 18
NULL 20 NULL //不符合条件的则为空
NULL NULL NULL
Hive DDL数据库定义语言
-
创建数据库
hive>create database hive_demo;
hive>create database if not exists hive_demo;
hive>show databases;
hive>show databases like ‘*t*’; //使用正则匹配
说明:hive为创建的数据库生成了相对应的目录(*.db),目录在{hive.metastore.warehouse.dir}属性下,
同时,数据库中的表将以目录中的子目录进行存储;default默认数据库除外! -
自定义修改数据库存放位置,需单独指定(*.db)目录
hive>create database hive1location
‘/user/hive/hive1.db’;
hive (default)> dfs -ls -R /user;【查看】
drwxrwxrwx - dragon supergroup 0 2008-07-25 01:23 /user/hive
drwxrwxrwx - dragon supergroup 0 2008-07-25 01:23 /user/hive/hive1.db
drwxrwxrwx - dragon supergroup 0 2008-05-25 00:29 /user/hive/warehouse -
对数据库可以增加描述信息:
hive>create database if not exists hive2 comment 'hive2测试库';
hive>describe database hive2 ;
结果:
db_name comment location owner_name owner_type parameters
hive2 hive2测试库 hdfs://mycluster/user/hive/warehouse/hive2.db dragon USER -
对数据库添加属性信息:
hive>create database hive3 with dbproperties ('name'='geekbai','data'='2008-08-08');
hive>desc database extended hive3;
【查看】
结果:
hive (default)> desc database extended hive3;
OK
db_name comment location owner_name owner_type parameters
hive3 hdfs://mycluster/user/hive/warehouse/hive3.db dragon USER {data=2008-08-08, name=geekbai} -
使用数据库:
hive>use myhive1;
删除数据库:
hive>drop database if exists hive3;
hive>drop database if exists hive3 cascade;
说明:cascade表示级联关系;restrict表示限制约束(默认值); -
修改数据库:
除数据库的属性以外,其他信息均不能修改:
hive>alter database hive3 set dbproperties ('name'='hyxy','data'='2009-08-08');
-
创建表
a. 创建表:
hive> create table hive1.student(sid intcomment 'xuehao'
,name stringcomment 'mingzi'
)comment 'student table'
tblproperties (‘name’=‘geek’,‘data’=‘2009-08-08’) ;
【hive1.student 表示在hive1库下创建新表,comment ’ 描述内容’ 表示添加属性描述,tblproperties(’ ')添加表信息】
b. 查看表描述:
hive>desc hive1.student;
结果:col_name data_type comment sid int xuehao name string mingzi
hive>
desc extended hive1.student;
【打印出所有的描述】col_name data_type comment sid int xuehao name string mingzi Detailed Table Information Table(tableName:student, dbName:hive1, owner:dragon, createTime:1566722723, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:sid, type:int, comment:xuehao), FieldSchema(name:name, type:string, comment:mingzi)], location:hdfs://mycluster/user/hive/hive1.db/student, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}, skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), storedAsSubDirectories:false), partitionKeys:[], parameters:{data=2009-08-08, name=geek, transient_lastDdlTime=1566722723, comment=student table}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE)
c. 拷贝表模型,创建新的表(数据不拷贝)
hive>create table hive1.student2 like hive1.student;