为什么会出现Hive?
关系型数据库已产生多年,SQL成熟简化开发,降低人员成本、Java人员可编写UDF函数
一、 Hive导入、导出
导入(在hive中敲)
《root》load data local inpath '/home/hdfs/a.txt' overwrite into tableouter_talbe1;
NULL值处理
hive中NULL默认是以'\N'表示的可以通过ALTER TABLE table_name SETSERDEPROPERTIES('serialization.null.format' = '');修改空值描述符
导出
导出到本地文件系统:
insert overwrite localdirectory '/home/wyp/wyp' select * from wyp;
导出到HDFS:
insert overwrite directory '/home/wyp/hdfs'select * from wyp;
指定分隔符号:
insert overwrite local directory'/home/yangping.wu/local'
row format delimited
fields terminated by ','
select *from wyp;
1,新建一个txt文件,并往里面添加内容
2,创建表
create table test01_inner_yangchanglong
(
id int,
num string,
sex string,
age int
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|';
图一,数据导入
图二,数据导出
图三,数据查看\删除
3.数据导入补充
4.数据导出补充
HDFS:1,文件形式(服务器);2,DB(数据库);3,数据流(日志。。。)
Hive导入:1,其他表获得;2,从HDFS上获得;3,从服务器上导入
将数据导入hive(六种方式)
1.从本地导入
loaddata local inpath 'file_path' into table tbname;
用于一般的场景。
2.从hdfs上导入数据
loaddata inpath ‘hafd_file_path’ into table tbname;
使用与大数据的存储
3.load方式的覆盖
loaddata local inpath 'file_path' overwrite into table tbname;
用于零时表。
4.子查询方式
create table tb2 as select * from tb1;
5.insertinto
insertinto table tb2 select q1;
6.location
然后put就好。
将数据从hive里导出(四种方式)
1.insert方式
1)保存到本地
insertoverwrite local directory 'path' select q1;
insert overwrite local directory 'path' row format delimited fields terminated by '\t' select q1;
2)保存到HDFS上
insert overwrite directory 'hdfs_path' select* from dept;
注意点:hdfs_path必须存在
2.bin/hdfs -get
与put一样,属于HDFS的基本操作。
dfs -get.............
3.linux的重定向,其中-e 表示后面直接接带双引号的sql语句;而-f是接一个文件,文件的内容为一个sql语句
-e
-f
4.sqoop协作框架。
二、 创建索引、视图练习
1.创建索引:
hive> create index [index_studentid] on table student_3(studentid)
> as'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
> with deferredrebuild
> IN TABLEindex_table_student_3;
OK
Time taken: 12.219seconds
hive>
org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler :创建索引需要的实现类
index_studentid:索引名称
student_3:表名
index_table_student_3:创建索引后的表名
2.查看索引表:
hive>select*fromindex_table_student_3;
OK
Timetaken: 0.295 seconds
3.加载索引数据:
hive> alter index index_studentid on student_3 rebuild;
4.查询索引表中数据:
hive> select*from index_table_student_3;
5.删除索引:
DROP INDEX index_studentid on student_3;
6.查看索引
hive> SHOW INDEX on student_3;
(分区和分桶中分区以HDFS中文件分隔来分区,如果继续按需求分的话,在最后那个文件中进行分桶)索引和分区不同,它根据表格中某个属性进行划分。
索引: 每次查询时候都要先用一个job扫描索引表,如果索引列的值非常稀疏,那么索引表本身也会非常大;
索引表不会自动rebuild,如果表有数据新增或删除,那么必须手动rebuild索引表数据;
视图:只有逻辑视图,没有物化视图;
视图只能查询,不能Load/Insert/Update/Delete数据;
视图在创建时候,只是保存了一份元数据,当查询视图的时候,才开始执行视图对应的那些子查询。
1.创建视图:
2.查看视图:
删除一个视图
使用下面的语法来删除视图:
DROP VIEW view_name
1. 新增数据
2. 新增表格并且插入或覆盖数据
3. 查询和关联
4. 分区
根据ID进行分桶,根据score进行排序
5. alert操作
三、 事务表练习
创建一个表
如图表,和插入的数据:
数据插入成功和更新数据:
数据更新成功和删除数据:
何为事务?就是一组单元化操作,这些操作要么都执行,要么都不执行,是一个不可分割的工作单位。
事务(transaction)所应该具有的四个要素:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。这四个基本要素通常称为ACID特性。
1.在现在的版本中,只支持ORC文件格式。
2.默认情况下,hive的事务性是关闭的,开启需要设置transactional=true。
3.表必须是Bucket表。
4.外部表不能成为ACID表,因为外部表的变化,不能被Compact控制。
5.不能从一个非ACID会话向ACID表中读写数据。这意味着Hive事务管理必须设置成org.apache.Hadoop.hive.ql.lockmgr.DbTxnManager
6.目前只支持快照级别的隔离,不支持脏读,重复读等。
7.存在的Zookeeper和内存锁管理机制与事务是不兼容的
set hive.support.concurrency=true;
set hive.enforce.bucketing=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
Hive的ORC格式文件,有base files和deltafiles。
base files是基础文件,delta files是增删改操作生成的新文件。
当进行ACID操作的时候,base files 和 delta files会发生变化,
满足一定条件后,这两类文件会进行合并,产生新的base files。
hive.compactor.check.interval
检查表或者分区是否需要compact的时间间隔,秒为单位,默认300秒。
检查的方式是,向Namenode发送请求,查看相应的表或者分区是否发生事务操作。
hive.compactor.max.num.delta
compactor尝试在一个job中处理的最多的Delta文件个数
Compaction不支持并发的读写数据,在Compaction之后,系统会等所有对老文件的读完成之后,才删除老文件
hive事务表参数配置
sethive.support.concurrency=true;
sethive.enforce.bucketing=true;
sethive.exec.dynamic.partition.mode=nonstrict;
set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
以上配置在hive-site中配置;
sethive.compactor.initiator.on=true;
sethive.compactor.worker.threads=1;
以上配置在hiveserver2-site中配置;
对hive表进行更新的时候,管理事务是很重要的一个部分。
metastore会跟踪正在进行的读和写事务。
为了提供一个持续性的视图来进行读操作,metastore会对每一个写操作创建一个事务ID。
事务ID,在一个metastore中是从1严格增长的。
在内部,事务是通过Hive Metastore管理的。
具体修改操作是通过ORC API执行到HDFS上面的,绕开了Metastore。
当一个读操作开始的时候,metastore会提供读的表,和当前已经提交的事务ids集合。这些集合由最大提交事务id和还在进行中的事务id。
当进行查询操作的时候,会启动MR任务,相同的集合会通过jobconf提供给MR任务,因此,读操作看到的是,命令开始那一刻,表的一个连续的snapshot视图。
写操作,metastore会提供正在被读的表和正在被写的表的列表,获取到一个可以读取的有效事务id集合,和写事务id。所有的写入数据,都会打上写事务id标签。
在上面两种情况,当命令完成的时候,它应该通知metastore。metastore一定要确认或者放弃被抛弃的事务,hive客户端一定要每十分钟通知metastore一次,说明命令还在运行,否则的话,这个事务会被放弃。metastore会维护着被读的表集合和相应的事务id,这样它可以在上次读操作完成后,调度合并完数据的删除。
在一个写事务被提交到metastore之前,所有的那个事务的HDFS文件必须在它们的最终位置。
同时,在一个写事务被放弃之前,所有的文件必须从HDFS上面删除了。
这能保证,给reader的任何有效的事务id都只有正确的HDFS文件与它关联。
Hive事务使用建议
附录:http://www.infoq.com/cn/articles/guide-of-hive-transaction-management