基本数据类型
String和int在创建表,时间戳(hive与Hbase结合时,底层的映射结构,是自动完成,如果没有,hive与Hbase结合有困难)
2.1复合数据类型
创建学生表
hive>CREATE TABLE student(
id INT,
name STRING,
favors ARRAY<STRING>,
scores MAP<STRING, FLOAT>
);
2.2hive记录中默认分隔符
分隔符描述语句
\n分隔行LINES TERMINATED BY '\t'
^A分隔字段(列),显示编码使用\001FIELDS TERMINATED BY '\001'
^B分隔复合类型中的元素,显示编码使用\002COLLECTION ITEMS TERMINATED BY '\002'
^C分隔map元素的key和value,显示编码使用\003MAP KEYS TERMINATED BY '\003'
Hdfs存储表时用的是分隔符
原始数据组织方式(导入hive表前的数据)
1001\001zhangsan\001AA\002\BB\001key\003value 1002\001lisi
在hdfs数组存放方式
1001^Azhangsan^AAA^BBB^Akey^Cvalue\n1002^Alisi
2.3复合类型—Struct使用
structs内部的数据可以通过DOT(.)来存取,例如,表中一列c的类型为STRUCT{a INT; b INT},我们可以通过c.a来访问域a
hive> create table student_test(id INT,infostruct<name:STRING, age:INT>) ROW FORMAT DELIMITED(限定)FIELDS TERMINATED(终止)BY ',' COLLECTION(集合)ITEMS TERMINATED BY ':'; (第一个是字段id与struct结构体的分隔符逗号或者tab(\t)都可以,第二个是struct分割)
vi student_test
1001,zhangsan:24
1002,lisi:28
1003,wangwu:25
(local inpath,应该就是为什么可以将/root/student_test传进去)
(导入数据)load datalocal inpath"student_test"into table student_test;
Select * from student_test;
(查询id)select id from student_test;
(查询structs内部数据,通过点的方式)
select id,info.name from student_test;
Select id,info.name,info.age from student_test;
可以直接在MySQL(储存的是元数据)查看创建的表
也可以在hdfs(储存的是表的实际信息)上查看
dfs -cat /usr/hive/warehouse/student_test/student_test;
第一个是表名没有内容,第二个才是表的内容,除了默认格式不一样,指定格式显示就会一样的。
2.4复合类型—Array使用
array中的数据为相同类型,例如,假如array A中元素['a','b','c'],则A[1]的值为'b'
create table class_test(name string,student_id_listarray<INT>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY ':';
vi class_test
zhangsan,10:25:27:37
lisim,09:31:42:46
wangwu,06:12:18
(导入表)load data local inpath "class_test"into table class_test;
select * from class_test;
(查询名字)select name from class_test;
(集合类型的角标查询)select name,student_id_list[0] from class_test;
select name,lstudent_id_list[0] from class_testwhere name='zhangsan';
角标超出范围会显示NULL
按照列解析的
2.5复合类型—Map使用
访问指定域可以通过["指定域名称"]进行,例如,一个Map M包含了一个group-》gid的kv对,gid的值可以通过M['group']来获取
create table employee(id string,perfmap<string, int>) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' COLLECTION ITEMS TERMINATED BY ',' MAP KEYS TERMINATED BY ':';
(字段之间使用的是\t(Tab键),集合(多个map就会是集合)之间的用,号,map之间用:分割)
vi employee(在~目录下面)
1001job:80,team:60,person:70
1002job:60,team:80,person:80
1003job:90,team:70,person:100
Load data local inpath"employee"into table employee;(备注;使用双引号和单引号也是可以的。)
(查询)Select *from employee;
Select id,perf['job'] from employee;
Select id,perf['job'],perf['person'] from employee;
(设置别名,显示表头)select id,perf['job']as job,perf['team'] as team,perf['person'] as person from employee;
三、数据定义
3.1数据库定义
默认数据库"default"
使用#hive命令后,不使用hive>use <数据库名>,系统默认的数据库。可以显式使用hive> use default;
创建一个新库
hive>CREATE DATABASE
[IF NOT EXISTS]mydb
[LOCATION]'/.......'
[COMMENT]'....';
hive>SHOW DATABASES;
hive>DESCRIBE DATABASE[extended]mydb;
hive>DROP DATABASE[IF EXISTS] mydb[CASCADE];
Create database mydb;
在hdfs创建mydb.db目录会存放mydb数据里面的内容
消除不必要的提示(干扰我们的判断)
Create database if not exists mydb;
Use mydb;
Create table t1(name string);
Show tables;
Create database bd;
Show databases;
Drop database if exists db;
(级联删除)
drop database if exists mydb cascade;
3.2 表定义
hive>CREATE TABLE IF NOT EXISTS t1(...)
[COMMENT '....']
[LOCATION '...']
(当前数据库显示其他数据库的表)hive>SHOW TABLES in mydb;
hive>CREATE TABLE t2 LIKE t1;
hive>DESCRIBE t2;
(寻找某个关键字的表)show tables in default 'class*';
(显示表的结构)desc t1;
(显示表的结构,原来的)describe t1;
(显示拓展信息)desc extended t1;
(显示拓展信息更加有结构,查看分隔符)desc formatted t1;
(创建另一个表进行测试,防止操作不当对原表造成伤害)create table t2 like t1;
(复制其他数据库的表的结构)Create table t3 like default.employee;