点击上方“” 

选择“星标”公众号

每天早上8:30,一起实现自我增值

Hive是基于Hadoop的一个数据仓库工具,使用类SQL的查询语句,即HQL对数据进行查询,其本质是将HQL语句转化为MapReduce任务执行。Hive的数据存储于HDFS兼容的文件系统。为提高文件查询效率,Hive也有分区分桶的操作,本文具体介绍二者的区别与实践代码。

01

hive与关系型数据库的区别

1、Hive数据查询

Hive使用类SQL的查询语句HQL,本质上是将其转化为MapReduce任务运行;

2、数据存储位置

Hive将数据存储在HDFS,而关系型数据库则是将数据存在块设备或者本地文件系统中;

3、数据格式

Hive没有定义专门的数据格式,数据格式由用户指定。为定义数据格式,用户需要指定三个属性:列分隔符(通常为空格,"\t","\x001"),行分隔符("\n")及文件读取方法(Hive中默认有三种文件格式:TextFile、Sequencefile、RCFile)。由于在加载数据的过程中,不需要从用户数据格式到hive定义的数据格式转换,因此,Hive在加载过程中不会对数据本身进行任何修改,而只是数据内容的复制或者移动到相应的HDFS目录中。而在数据库中,不同的数据库有不同的存储引擎,定义了自己的数据格式。所有数据都会按照一定的组织存储,因此数据库加载数据的过程会比较耗时;

4.数据更新

由于Hive是针对数据仓库应用设计的,而数据仓库的仓库是读多写少,因此,Hive中不支持数据的改写和添加,所有数据都是加载的时候确定好的。而数据库中的数据通常要经常进行修改的,因此可以使用insert into 关键字添加数据,使用update …set修改数据,且仅支持覆盖重写整个表;

5.执行延迟

Hive查询数据的时候,需要扫描整个表格,导致延迟高,另外一个原因就是,执行Hive计算的框架是Hadoop,由于MapReduce本身具有较高的延迟,因此有较高的延迟,因此当数据规模较小的时候,不太于适用Hive;02

hive分区操作

hive分区是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表的内容巨大,在查询时进行全表扫描耗费的资源非常多。该情况下,我们可以按照日期对数据表进行分区,不同日期的数据存放在不同的分区,在查询时只要指定分区字段的值就可以直接从该分区查找。

1、创建分区表

hive> create table ptest (userid int) partitioned by (name string) row format delimited fields terminated by '\t';

注意:

①、在创建分区表时,通过关键字 partitioned by (name  string)声明该表是分区表,并且是按照字段name进行分区,name值一致的所有记录存放在一个分区中,分区属性name的类型是string类型。当然,可以依据多个列进行分区,即对某个分区的数据按照某些列继续分区

②、所谓分区,这是将满足某些条件的记录打包,做个记号,在查询时提高效率,相当于按文件夹对文件进行分类,文件夹名可类比分区字段。这个分区字段形式上存在于数据表中,在查询时会显示到客户端上,但并不真正在存储在数据表文件中,是所谓伪列。所以,千万不要以为是对属性表中真正存在的列按照属性值的异同进行分区。比如上面的分区依据的列name并不真正的存在于数据表中,是我们为了方便管理添加的一个伪列,这个列的值也是我们人为规定的,不是从数据表中读取之后根据值的不同将其分区。我们并不能按照某个数据表中真实存在的列,如userid来分区

2、将本地文件中的数据加载到分区表中

hive> load data local inpath '/home/hadoop/dataset/ptest.txt' into table ptest partition(name='Jack');

注意:向分区表导入数据时,通过关键字partition(name="jack")声明数据要导入到表的哪个分区,这里表示要将数据导入到分区为name=jack的分区

3、查看分区数据

hive> select userid from ptest where name="Jack";

分区目的在于提高查询效率,查询分区数据的方式就是指定分区名,此时不再全表扫描,而是直接从指定分区(如name=jack的分区)中查询,从hdfs的角度看就是从相应的文件系统中(如name=jack文件夹下)去查找特定的数据

4、查看分区信息

hive> show partitions ptest;

5、向分区中插入数据

hive> insert overwrite table ptest partition (name="Jack") select name from userinfo;

该操作中,我们就可以验证分区所依据的列其实是一个伪列,如果你要从具有相同结构的分区表中导入数据,会失败。比如两个分区表,都有两个真实的列和一个分区列(伪列),我们要将一个分区表中的数据导入到另一个分区表,会报错。错误信息显示要导入的表只有两列(伪列不记在内,这说明其实数据表文件中只有两列),而源表却有三列(将伪列计算在类)。

03

hive分桶操作

分桶是相对分区进行更细粒度的划分。分桶将整个数据内容安装某列属性值的hash值进行区分,如要安装name属性分为3个桶,就是对name属性值的hash值对3取模,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件

1、创建分桶表

hive> hive.enforce.bucketiong=true;hive> create table btest(id int,name string) clustered by(id) into 3 buckets row format delimited fields terminated by '\t';

注意:

①、分桶之前要执行命令hive.enforce.bucketiong=true;

②、使用关键字clustered by 指定分区依据的列名及桶数

③、与分区不同的是,分区依据的不是真实数据表文件中的列,而是我们指定的伪列,但是分桶是依据数据表中真实的列而不是伪列。所以在指定分区依据的列的时候要指定列的类型,因为在数据表文件中不存在这个列,相当于新建一个列。而分桶依据的是表中已经存在的列,这个列的数据类型显然是已知的,所以不需要指定列的类型

2、向桶中插入数据

hive> insert overwrite table btest select * from userinfo;

3、查看桶信息

hive> dfs -ls /user/hive/warehouse/btest;

4、查看分桶数据

hive> select * from btest tablesample(bucket 1 out of 3 on id);

04

hive分区分桶

hive> create table logs(ts bigint,line string)     > partitioned by(dt string,country string)    > clustered by (ts) sorted by (ts asc) into 4 buckets    > row format delimited fields terminated by '\t';

注意:上述代码实现了对数据表分区后继续分桶的操作。我们在hdfs文件系统上看不出分桶的多个数据表文件,只能看见一个文件,但是能从文件路径上或查询分桶结果时可看出分区的信息。

全文完,感谢您的耐心阅读

请顺手点个“好看”吧~

▼ 往期精彩回顾 ▼

hive 修改分区备注_Hive分区、分桶操作及其区别相关推荐

  1. hive详细笔记(四)-Hive内部表,外部表,分区表,分桶表详解(附带讲解视频)

    本节目录 内部表和外部表 静态分区表 动态分区表 分桶表 抽样查询 1 内部表和外部表 未被external修饰的是内部表(managed table),被external修饰的为外部表(extern ...

  2. Hive基础知识(三)--分桶表

    1.分桶表 分桶和分区一样,也是一种通过改变表的存储模式,从而完成对表优化的一种调优方式,但和分区不同的是,分区是将表拆分到不同的子目录中进行存储,而分桶是将表拆分到不同文件中进行存储. 2.分桶操作 ...

  3. Hive分区、分桶操作及其比较(转自:http://blog.csdn.net/epitomizelu/article/details/41911657)

    1,Hive分区. 是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表 ...

  4. 大数据快速入门(09):永久弄清楚 Hive 分区表和分桶表的区别

    蛋蛋 和 小智 今天又在"打情骂俏",他们今天在谈论分区表和分桶表,走,我们去听听. 这天,蛋蛋去茶水间倒水,他把水杯放在饮水机下面,打开开关,一直盯着墙上的画在看,灵魂仿佛已经飞 ...

  5. 大数据之hive分区表和分桶表的区别

    (一)二者的区别 (1)分区和分桶都是细化数据管理,但是分区表是手动添加区分,由于hive是读模式,所以对添加进分区的数据不做模式校验.分桶表的数据时按住某些分桶字段进行hash散列 相乘的多个文件, ...

  6. Hive的分区表和分桶表的区别

    1,Hive分区. 是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表 ...

  7. hive 自定义元数据表_Hive分区表和桶表的使用

    我们看官网文档中这个地方 我们先创建好数据库,以供练习 使用数据库 我们创建数据表 我们创建分区表,选取的字段不能是表中存在的字段 元数据信息 Formatted信息 那我们加载信息 load dat ...

  8. hive修改表备注,字段备注

    修改表备注: ALTER TABLE 数据库名.表名 SET TBLPROPERTIES('comment' = '新的表备注'); 修改字段信息: ALTER TABLE 数据库名.表名 CHANG ...

  9. hive修改表备注和表字段

     说明: 例子 : 修改表备注: ALTER TABLE dm_gsryqzfxryxxtj_wdja SET TBLPROPERTIES('COMMENT'='个诉人员潜在风险人员信息统计'); 修 ...

最新文章

  1. mysql数据库建表失败_mysql数据库文件太大导致建表失败,如何避免
  2. GitLab 完成 1 亿美元融资 以 10 亿美元的估值成为“独角兽”
  3. 使用Notepad++ 删除非连续的列内容操作实例
  4. seurat提取表达矩阵_单细胞数据分析神器——Seurat
  5. k8s:Service的四种类型和三种代理模式
  6. SOA架构设计经验分享—架构、职责、数据一致性
  7. 《中国人工智能学会通讯》——11.34 基于近似动态规划的优化控制研究及 在电力系统中的应用...
  8. 安卓短信功能全解:调用系统短信功能发送短信、彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信。
  9. VALSE学习(五):看图说话-Visual Question Answering as Reading Comprehension
  10. C# OpenCV OpenCVSharp应用实例--LCD屏幕脏污检测
  11. 怎么更改wifi频段_如何更改wifi的频段
  12. iOS MVC设计模式
  13. zsh: illegal hardware instruction
  14. 这14位世界顶级的投资家,是很多期货股票交易员心中的偶像
  15. [CODE【VS】]江哥的DP题d
  16. mysql如何重复数据合并_mysql合并重复数据
  17. C++ decltype类型说明符
  18. CSP-S2021复赛题解
  19. 深度学习中的normalization总结(BN、LN、WN、IN、GN)
  20. 留给小米汽车的时间,不到三年了

热门文章

  1. python socket服务器_记-python socket服务器端四部曲
  2. css如何调整红心样式_CSS3跳动的红心
  3. java爬去淘宝数据链接重定向_scrapy爬取天猫被重定向302问题
  4. 迁移桌面程序到MS Store(8)——通过APPX下载Win32Component
  5. BGP 路由属性 公认可选 LOCAL_PREF
  6. 每天进步一点点017
  7. 和朋友们一起探道一下CPA广告反作弊方面的技术,欢迎大家发表意见。
  8. 为对抗训练的理论工作添砖加瓦:选择核心子集进行训练,大大缩短训练时间...
  9. 高达82 fps的实时文本检测,华科AAAI2020提出可微分二值化模块
  10. Zeusee 开源移动端车型识别系统HyperVID