1.Default数据仓库的最原始位置是在hdfs上的:/user/hive/warehouse路径下
2.在仓库目录下,没有对默认的数据库default创建文件夹。如果某张表属于default数据库,直接在数据仓库目录下创建一个文件夹。
3.修改default数据仓库原始位置(将hive-default.xml.template如下配置信息拷贝到hive-site.xml文件中)
hive.metastore.warehouse.dir
/user/hive/warehouse111
location of default database for the warehouse
配置同组用户有执行权限
hdfs dfs -mkdir /user/hive/warehouse111
bin/hdfs dfs -chmod g+w /user/hive/warehouse111
1.在hive-site.xml文件中添加如下配置信息,就可以实现显示当前数据库,以及查询表的头信息配置。
hive.cli.print.header
true
hive.cli.print.current.db
true
2.重新启动hive,对比配置前后差异
1.配置前
2.配置后
需求:将本地 /opt/module/hiveTest/student.txt 这个目录下的数据导入到 hive 的 student(id int, name string) 表中。
1.数据准备:在 /opt/module/hiveTest/student.txt 这个目录下准备数据
(1)在 /opt/module/ 目录下创建 hiveTest
[root@bigdata111 module]# mkdir hiveTest
(2)在/opt/module/hiveTest/目录下创建student.txt文件并添加数据
[root@bigdata111 hiveTest]# touch student.txt
[root@bigdata111 hiveTest]# vi student.txt
1001,zhangsan
1002,lisi
1003,wangwu
注意以 , 键间隔。(英文逗号)
2.Hive实际操作
(1)启动hive
[root@bigdata111 hiveTest]# hive
(2)显示数据库
hive>show databases;
(3)使用default数据库
hive>use default;
(4)显示default数据库中的表
hive>show tables;
(5)删除已创建的student表
hive> drop table student;
(6)创建student表, 并声明文件分隔符’,’
hive> create table student(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’;
(7)加载/opt/module/datas/student.txt 文件到student数据库表中。
hive>load data local inpath ‘/opt/module/hiveTest/student.txt’ into table student;
(8)Hive查询结果
hive> select * from student;
本地加载数据(数据不匹配(分隔符和数据类型)的时候,查看表中数据是 NULL)。
[root@bigdata111 hiveTest]# hive -help
usage: hive
-d,--define Variable subsitution to apply to hive
commands. e.g. -d A=B or --define A=B
--database Specify the database to use
-e SQL from command line
-f SQL from files
-H,--help Print help information
--hiveconf Use value for given property
--hivevar Variable subsitution to apply to hive
commands. e.g. --hivevar A=B
-i Initialization SQL file
-S,--silent Silent mode in interactive shell
-v,--verbose Verbose mode (echo executed SQL to the
console)
“-e”不进入hive的交互窗口执行sql语句
hive -e "select id from student;"
“-f”执行脚本中sql语句
(1)在/opt/module/hiveTest目录下创建hivef.sql文件
touch hivef.sql
文件中写入正确的sql语句
select *from student;
(2)执行文件中的sql语句
hive -f /opt/module/hiveTest/hivef.sql
(3)执行文件中的sql语句并将结果写入文件中(注:可能含有其他的表信息,如表头)
hive -f /opt/module/hiveTest/hivef.sql > /opt/module/hiveTest/hive_result.txt
1.退出hive窗口:
hive(default)>exit;
hive(default)>quit;
在新版的oracle中没区别了,在以前的版本是有的:
exit:先隐性提交数据,再退出;
quit:不提交数据,退出;
2.在hive cli命令窗口中如何查看hdfs文件系统
hive(default)>dfs -ls /;
3.在hive cli命令窗口中如何查看hdfs本地系统(标准Linux命令)
hive(default)>! ls /opt/module/datas;
4.查看在hive中输入的所有历史命令
(1)进入到当前用户的根目录/root或/home/root
(2)查看. hivehistory文件
1.查看当前所有的配置信息
hive>set;
2.参数的配置三种方式
(1)配置文件方式
默认配置文件:hive-default.xml
用户自定义配置文件:hive-site.xml
注意:用户自定义配置会覆盖默认配置。另外,Hive也会读入Hadoop的配置,因为Hive是作为Hadoop的客户端启动的,Hive的配置会覆盖Hadoop的配置。配置文件的设定对本机启动的所有Hive进程都有效。
(2)命令行参数方式
启动Hive时,可以在命令行添加-hiveconf param=value来设定参数。
例如:
bin/hive -hiveconf mapred.reduce.tasks=10;
注意:仅对本次hive启动有效
查看参数设置:
hive (default)> set mapred.reduce.tasks;
显示为:mapred.reduce.tasks=10
默认mapred.reduce.tasks=-1
(3)参数声明方式
可以在HQL中使用SET关键字设定参数
例如:
hive (default)> set mapred.reduce.tasks=10;
注意:仅对本次hive启动有效。
查看参数设置
hive (default)> set mapred.reduce.tasks;
上述三种设定方式的优先级依次递增。即配置文件<命令行参数<参数声明。注意某些系统级的参数,例如 log4j 相关的设定,必须用前两种方式设定,因为那些参数的读取在会话建立以前已经完成了。
配置文件中修改(永久)
Hive交互窗口中修改(临时,针对本窗口)
Hive在命令行中修改(临时,针对本窗口)
Hive数据类型 | Java数据类型 | 长度 | 例子 |
---|---|---|---|
TINYINT | byte | 1byte有符号整数 | 20 |
SMALINT | short | 2byte有符号整数 | 20 |
INT | int | 4byte有符号整数 | 20 |
BIGINT | long | 8byte有符号整数 | 20 |
BOOLEAN | boolean | 布尔类型,true或者false | TRUE FALSE |
FLOAT | float | 单精度浮点数 | 3.14159 |
DOUBLE | double | 双精度浮点数 | 3.14159 |
STRING | String | 字符系列。可以指定字符集。可以使用单引号或者双引号。 | ‘now is the time’ “for all good men” |
TIMESTAMP | 时间类型 | ||
BINARY | 字节数组 |
对于Hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能 其中最多能存储多少个字符,理论上它可以存储2GB的字符数。
数据类型 | 描述 | 语法示例 |
---|---|---|
STRUCT | 和c语言中的struct类似,都可以通过“点”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, last STRING},那么第1个元素可以通过字段.first来引用。 | struct() |
MAP | MAP是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素 | map() |
ARRAY | 数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第2个元素可以通过数组名[1]进行引用。 | Array() |
Hive有三种复杂数据类型ARRAY、MAP 和 STRUCT。ARRAY和MAP与Java中的Array和Map类似,而STRUCT与C语言中的Struct类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。
假设某表有如下一行,我们用JSON格式来表示其数据结构。在Hive下访问的格式为
{
"name": "songsong",
"friends": ["bingbing" , "lili"] , //列表Array,
"children": { //键值Map,
"xiao song": 18 ,
"xiaoxiao song": 17
}
"address": { //结构Struct,
"street": "hai dian qu" ,
"city": "beijing"
}
}
基于上述数据结构,我们在Hive里创建对应的表,并导入数据。
创建本地测试文件test.txt
songsong,bingbing_lili,xiao song:18_xiaoxiao song:17,hai dian qu_beijing
yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing
注意,MAP,STRUCT和ARRAY里的元素间关系都可以用同一个字符表示,这里用“_”。
Hive上创建测试表test*
create table test(
name string,
friends array,
children map,
address struct
)
row format delimited fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';
字段 | 解释 |
---|---|
row format delimited fields terminated by ‘,’ | – 列分隔符 |
collection items terminated by ‘_’ | –MAP STRUCT 和 ARRAY 的分隔符(数据分割符号) |
map keys terminated by ‘:’ | – MAP中的key与value的分隔符 |
lines terminated by ‘\n’; | – 行分隔符 |
导入文本数据到测试表
hive (default)> load data local inpath ‘/opt/module/hiveTest/test.txt’ into table test;
访问三种集合列里的数据,以下分别是ARRAY,MAP,STRUCT的访问方式
如果起别名:select friends[1] as pengyou from test where name=“songsong”;
数据库模式定义语言DDL(Data Definition Language),是用于描述数据库中要存储的现实世界实体的语言。
创建一个数据库,数据库在HDFS上的默认存储路径是/user/hive/warehouse/*.db。
hive (default)> create database db_hive;
可能出现的报错:
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:For direct MetaStore DB connections, we don’t support retries at the client level.)
解决办法:https://blog.csdn.net/mo_ing/article/details/81219533
避免要创建的数据库已经存在错误,增加 if not exists 判断。(标准写法)
创建一个数据库,指定数据库在HDFS上存放的位置
hive (default)> create database db_hive2 location ‘/db_hive2.db’;
用户可以使用ALTER DATABASE命令为某个数据库的DBPROPERTIES设置键-值对属性值,来描述这个数据库的属性信息。数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。
hive (default)> alter database db_hive set dbproperties(‘createtime’=‘20190912’);
在mysql中查看修改结果
hive> desc database extended db_hive;
显示数据库
hive> show databases;
过滤显示查询的数据库
hive> show databases like 'db_hive*';
OK
db_hive
db_hive_1
hive (default)> use db_hive;
1.删除空数据库
hive>drop database db_hive2;
2.如果删除的数据库不存在,最好采用 if exists判断数据库是否存在
drop database if exists db_hive2;
3.如果数据库不为空,可以采用cascade命令,强制删除
drop database db_hive cascade;
1.建表语法
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], …)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], …)]
[CLUSTERED BY (col_name, col_name, …)
[SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
2.字段解释说明:
(1)CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS选项来忽略这个异常。
(2)EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
(3)COMMENT:为表和列添加注释。
(4)PARTITIONED BY 创建分区表
(5)CLUSTERED BY 创建分桶表
(6)SORTED BY 不常用(全局排序)
(7)ROW FORMAT (格式化分隔符)
DELIMITED [FIELDS TERMINATED BY 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, …)]
用户在建表的时候可以自定义SerDe或者使用自带的SerDe。如果没有指定ROW FORMAT 或者ROW FORMAT DELIMITED,将会使用自带的SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。
(8)STORED AS指定存储文件类型
常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)
如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。
(9)LOCATION :指定表在HDFS上的存储位置。
(10)LIKE允许用户复制现有的表结构,但是不复制数据。
理论
默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表,Hive会(或多或少地)控制着数据的生命周期。Hive默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定义的目录的子目录下。 当我们删除一个管理表时,Hive也会删除这个表中数据。管理表不适合和其他工具共享数据。
案例实操
(1)普通创建表
create table if not exists student2(
id int, name string
)
row format delimited fields terminated by ‘\t’
stored as textfile
location ‘/user/hive/warehouse/student2’;
(2)根据查询结果创建表(查询的结果会添加到新创建的表中)
create table if not exists student3
as select id, name from student;
(3)根据已经存在的表结构创建表
create table if not exists student4 like student;
(4)查询表的类型
hive (default)> desc formatted student2;
理论
因为表是外部表,所以Hive并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。
管理表和外部表的使用场景:
每天将收集到的网站日志定期流入 HDFS 文本文件。在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过 SELECT+INSERT 进入内部表。