狠狠撸

狠狠撸Share a Scribd company logo
贬补诲辞辞辫中的懒人——贬颈惫别
Hive是什么
词典中,hive是蜂巢的意思。
Hadoop中,hive是一个数据仓库工具,
提供简单的sql查询功能
学习成本低,可以通过类SQL语句快
速实现简单的MapReduce统计,不必
开发专门的MapReduce应用,十分适
合数据仓库的统计分析。
SQL MRHive HDFS
懒人表现一:文件依赖症
读时模式,使用时候再处理。
文本文件保存。
建表必须跟文件格式对应,只能导入
一种格式的文件。
从文件中load数据进hive,只是将文
件放入HDFS,不加任何其他处理。
继续load文件,如果同名会覆盖,否
则增加HDFS里面的文件。
从别的表插入,会形成一个新文件。
懒人表现二:不干我不干
文本文件修改难。
不支持delete。
不支持update。
如果确实需要,创建新表,按照
delete或者update需求导入到新表。
不支持唯一性等。
可以修改表结构。
懒人表现三:分区需指定
一个分区意味着一个目录。
不对分区字段做处理。
Load一个文件需要指定出分区,无法
将一个文件load到多个分区中。
一旦分区,插入必须指定分区。
Insert select的方式可以有动态分区。
Select * 有分区的信息。
懒人表现四:索引弱
Hive一般不建索引。
索引保存为文本文件,格式为:索引
值,文件,文件偏移。
数据更新后需要执行重建索引。
懒人也上进
Hive有多种格式的文件,TextFile,
SequenceFile,RCFile,后两种为二进
制文件,提供了高的效率,但不能直
接load。
Hive提供了比较丰富的数据结构:数
组,结构体,映射。
Hive语法基本与MySQL一样。
不挑食。
提供了一些针对MR的语法。
懒人朋友多
HDFS保证了容灾性,分布式。
MapReduce可以处理大批量数据。
Hive可以将表保存为Hbase格式,也
可以使用Hbase的表。
Sqoop提供了方便的跟其他数据库的
交互。
导入Jar包可以增加函数。
直接使用linux命令或者脚本。

More Related Content

丑补诲辞辞辫中的懒人贬颈惫别

Editor's Notes

  • #3: Hive是蜂巢,hadoop是大象,所以hive的形象是一只有大象脑袋的蜜蜂。 Hive是。。。。。。(此处省略2千字,可以自行去http://baike./subview/699292/10164173.htm查看)。 Hive相当于一个转换器,将sql转换为map-reduce,之后的事情就靠hadoop的mapreduce和hdfs了。 Hive使用简单,在linux下输入hive,就可以使用。当然,你要等一等。 蜜蜂本来应该是勤劳的,为什么说hive是懒的呢?我们是有理由的。
  • #4: 传统的数据库,在把数据放入的时候,会将数据进行处理,比如数据校验,比如数据组织为某种结构。 读时模式,是说hive不对数据进行任何预先的处理,到需要读取的时候才会去处理。所以,一般把一个文件导入到hive中是很快的,但这并没有什么用。 hive将导入的一个文本文件保存为文本文件,不会附带任何的表的信息,数据的结构。 文件导入到hive中,hive所做的,不过是把文件拷贝到hdfs里面去而已(一般是放在 /user/hive/warehourse/dbname.db/tablename 这个目录下面),文件不加任何修改,load多个文件,就拷贝多个文件。所以,建个表,可以将任何的文件导进去。 hive不对文件做任何处理,那它是怎么识别数据的呢?如何分隔数据?分隔数据这个是在建表的时候做的。所以,建表必须跟文件格式对应,导致一个表只能导入一种格式的文件。识别数据这个是在具体使用的时候做的,可能导入的文件有10列,但是由于分隔符没设置好,导致表只有一列有数据,其他9列没识别,都为NULL。 hive很懒,甚至懒得给文件重命名。如果你导入的文件跟之前的同名,对不起,之前的文件会被覆盖,数据也没有了。 如果从别的表select出来插入的,操作一次,会有一个0000_0之类的文件产生,再操作一下,会增加新的这类文件。 内部表,外部表其实没什么很大区别,外部表load文件时候,会将文件迁移,外部表也是可以insert select的。
  • #5: 修改一个连续存放的文件,难度是很高的,而且hdsf也不让修改文件。一般做法都是直接重新开一个文件,读文件,修改后写到新文件去。 而hive存放数据都是用连续存放的,而且是存放在hdfs里面,那么它是如何去update或者delete了? hive给出的答案很简单:不支持delete,update等对数据的修改。 如果你要删掉id为10的数据,怎么办?用like创建个新表,然后 insert into table 新表 select * FROM 旧表 where id!=10 来搞定。 不支持唯一性,不用想着怎么建个唯一索引,或者搞个主键。有一个overwrite,比如insert overwrite table abc,或者load overwrite等的用法,这个用法很多博客说是会去重,我试了一下,简单暴力,将旧的数据全部干掉(外部表的也干掉),只留下新插入的数据。 当然,hive也不是个老顽固,它支持一些修改,比如表结构的修改,而且很快,不过这并没有什么用,hive修改表结构又不会去碰数据。
  • #6: 数据多了,分区是一个很自然的解决方法。比如mysql就支持分区,不同分区甚至可以放不同的硬盘上。 作为大数据,hive理所当然的支持分区。不过,记住一点,hive后面是文件,那它的分区怎么做的呢?so easy,一个分区搞一个目录,如果按照两个字段分区,则会有两层目录。Mysql可以对分区字段做处理,比如hash等,hive不管。 一个数据进来,如何判断它是哪个分区的呢?load一个文件的时候,需要指定它是哪一个分区的。由于它只是拷贝文件,那么它不会将文件查分放到几个目录下面,所以不能把一个文件load到不同的分区。 分区后,每次导入数据,都必须指定分区,否则出错。 insert select的方式导入的数据,可以指定分区为select出来的某一字段或多个字段,这称为动态分区。分区不用预先创建,hive会自动创建。这样也带来一些问题,可能会创建太多目录,零碎的。所以分区要设计好,hdfs还是喜欢大文件。 分区字段不会放在数据文件中,这点比较好,毕竟都是一样的。select * 是带有分区字段的。
  • #7: hive不是做实时,在线的,做离线的,一般是扫描大量的数据,所以一般不搞索引。 不过太懒也不好,所以,hive是可以搞索引的。创建语句为:create index user_index on table user(id) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild IN TABLE user_index_table; hive的数据文件是文本的,索引,也是个文本的,你可以cat一下看看。里面放的是索引项,文件,偏移位置,3列。 建索引的语句中的deferred rebuild,是说推后建立索引。意思是,虽然你说要建索引,但是你要发出请求,说要建,我才建。加多了数据,索引不会自动更新,要人工重建。而且这个重建是全部的重建,不是增量的。
  • #8: hive这么懒,怎么在大数据这个江湖混? hive其实也有一颗上进的心。 前面提到的,hive把数据用文本文件保存,这个其实是有别的方案的。hive有三种存储格式:TextFile,SequenceFile,RCFile。最原始的TextFile也是可以选择压缩的,一般用snappy比较好,虽然解压会慢,但是极大降低了硬盘的IO。SequenceFile是hdfs的一种文件格式,比较方便程序进行读取。RCFile是hive的一种格式,按列存储,更好压缩,但如果是select *模式,会比SequenceFile慢。但是,只有未压缩的TextFile才可以直接进行文件的load,其他格式的,一般是用insert select的方法添加数据。 Hive提供了Array,Map,Struct三种数据结构,有点NoSQL的意思。很多时候,我们用NoSQL,就是因为SQL不能存放数组,导致数据的膨胀。 Hive在Hadoop生态中是最平易近人的,一堆的人都号称自己用Hadoop,一问,就用了Hive。因为Hive跟MySQL的语法基本是一样的,mysql你怎么用,hive也就怎么用。 Hive对文件容错性高,一些行的数据不符合规范都可以继续,hive会用null去填充。这样,hive可以用于数据清洗等,先把一个原始的文件load进来,通过insert select的方法,导到一个压缩表里面去,导的时候,select加上where,把一些不符合的东西去掉。 Hive是把SQL转化为Map-Reduce,所以