hive 技术总结-----持续更新

Hive中追加导入数据的方式

从本地导入: load data local  inpath ‘/home/1.txt’ (overwrite)into table student;
从Hdfs导入: load data inpath ‘/user/hive/warehouse/1.txt’  (overwrite)into table student;
查询导入:  create table  student1 as select * from student;(也可以具体查询某项数据)
查询结果导入:insert (overwrite)into table staff  select * from track_log

Hive导出数据

用insert overwrite导出方式 
导出到本地: 
insert overwrite local directory ‘/home/robot/1/2’  rom format delimited fields terminated by ‘\t’ select * from staff;(递归创建目录)
导出到HDFS 
insert overwrite  directory ‘/user/hive/1/2’  rom format delimited fields terminated by ‘\t’ select * from staff;
Bash shell覆盖追加导出 重定向方式
hive -e “select * from staff;”  > /home/z/backup.log
Sqoop把hive数据导出到外部

hive 自定义函数

UDF函数其实就是一个简单的函数,执行过程就是在Hive转换成MapReduce程序后,执行java方法,类似于像MapReduce执行过程中加入一个插件,方便扩展。
Hive中有3种UDF:
  UDF:操作单个数据行,产生单个数据行;
  UDAF:操作多个数据行,产生一个数据行;
  UDTF:操作一个数据行,产生多个数据行一个表作为输出;

编程步骤

创建函数
添加jar  

hive 开窗函数

rank 开窗函数基于 over 子句中的 order by 确定一组值中一个值的排名。如果存在partition by ,则为每个分区组中的每个值排名。
     名可能不是连续的。例如,如果两个行的排名为 1,则下一个排名为 3。
dense_rank 与 rank 有一点不同,当排名一样的时候,接下来的行是连续的。如两个行的排名为 1,则下一个排名为 2。
row_number 从1开始对分区内的数据排序。

hive 实现修改数值方式

实际采用union all + left join (is null)变相实现update
思路:
1 取出增量数据;
2 使用昨日分区的全量数据通过主键左连接增量数据,并且只取增量表中主键为空的数据(即,取未发生变化的全量数据);
3 合并1、2的数据覆盖至最新的分区,即实现了update;
HQL delete实现
采用not exists/left join(is null)的方法变相实现。
1.取出已删除的主键数据(表B);
2.使用上一个分区的全量数据(表A)通过主键左连接A,并且只取A中主键为空的数据,然后直接insert overwrite至新的分区;

Hive中的排序关键字

sort by :不是全局排序,其在数据进入reducer前完成排序
order by :会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序).只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。
cluster by : 当distribute by 和sort by的字段相同时,等同于cluster by.可以看做特殊的distribute + sort
distribute by :按照指定的字段对数据进行划分输出到不同的reduce中

hive 内部表和外部表区别

创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。
删除表时:在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据

分区和分桶的区别

分区
    是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,
一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表的内容巨大,在查询时进行全表扫描耗费的资源非常多。
    那其实这个情况下,我们可以按照日期对数据表进行分区,不同日期的数据存放在不同的分区,
    在查询时只要指定分区字段的值就可以直接从该分区查找
分桶
    桶表的数据加载,只能通过insert  overwrite
    分桶是相对分区进行更细粒度的划分。
    分桶将整个数据内容安装某列属性值得hash值进行区分,如要按照name属性分为3个桶,就是对name
    属性值的hash值对3取摸,按照取模结果对数据分桶。
    如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件

分区表: 优点是:提高查询效率 要求是:分区字段绝对不能出现在表已有的字段内。
partitioned by (ds string)
分桶表: 优点是:提高join效率和用于数据取样。 要求是:分桶字段必须出现在表已有的字段内。
clustered by (id)

Fetch抓取

hive.fetch.task.conversion
默认是minamal,改为more后在全局查找,字段查找,limit查找下都不走MR
例如 select * from tab 不走MR

本地模式

hive.exec.mode.local.auto=true
数据量小于128M
数据文件个数4个
可以提升查询速度

小表、大表join

hive.auto.convert.join
默认是打开的,小表在左,加载到内存中
小表 25M

大表 join 大表

空key过滤 ,会到一个reduce里面,数据倾斜
空key转换on case when id is null then rand() else id  end=T.id

动态分区

hive.exec.dynamici.partition=true;  #开启动态分区,默认是false
set hive.exec.dynamic.partition.mode=nonstrict; #开启允许所有分区都是动态的,否则必须要有静态分区才能使用。
hive.exec.max.dynamic.partitions.pernode=100 (默认100,一般可以设置大一点,比如1000),表示每个maper或reducer可以允许创建的最大动态分区个数,默认是100,超出则会报错。
hive.exec.max.dynamic.partitions =1000(默认值) ,表示一个动态分区语句可以创建的最大动态分区个数,超出报错
hive.exec.max.create.files=10000,最大可以创建hdfs文件个数
hive.error.omn.empty.partition=flase当有空分区时是否报错

Hive 架构

    Hive架构包括如下组件:CLI(command line interface)、JDBC/ODBC、Thrift Server、Hive WEB Interface(HWI)、
metastore和Driver(Complier、Optimizer和Executor)
    Driver组件:核心组件,整个Hive的核心,该组件包括Complier、Optimizer和Executor,它的作用是将我们写的HQL
语句进行解析、编译优化,生成执行计划,然后调用底层的MapReduce计算框架。
    Metastore组件:元数据服务组件,这个组件存储hive的元数据,hive的元数据存储在关系数据库里,hive支持的关系数据库有derby、mysql。
    CLI:command line interface,命令行接口。
    ThriftServers:提供JDBC和ODBC接入的能力,它用来进行可扩展且跨语言的服务的开发,hive集成了该服务,能让不同的编程语言调用hive的接口。
    Hive WEB Interface(HWI):hive客户端提供了一种通过网页的方式访问hive所提供的服务。这个接口对应hive的hwi组件(hive web interface)

在这里插入图片描述

用户接口

用户接口主要有三个:CLI,Client 和 WUI。其中最常用的是 CLI,Cli 启动的时候,会同时启动一个 Hive 副本。
Client 是 Hive 的客户端,用户连接至 Hive Server。在启动 Client 模式的时候,需要指出 Hive Server 所在节
点,并且在该节点启动 Hive Server。 WUI 是通过浏览器访问 Hive。

元数据存储

Hive 将元数据存储在数据库中,如 mysql、derby。Hive 中的元数据包括表的名字,表的列和分区及其属性,表
的属性(是否为外部表等),表的数据所在目录等。

解释器、编译器、优化器、执行器

解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查
询计划存储在 HDFS 中,并在随后由 MapReduce 调用执行。

hive sql优化

  • 列剪裁:只读取查询中所需要用到的列,而忽略其它列。hive.optimize.cp=true(默认值为真)
  • 分区剪裁:在查询的过程中减少不必要的分区。hive.optimize.pruner=true(默认值为真)
  • GROUP BY替代COUNT(DISTINCT)达到优化效果
  • 根据数据量大小自定义控制map、reduce 个数
  • join关联前,对关联条件的非空、null 进行限制,减少无效数据、防止数据倾斜
  • 压缩存储,小文件合并
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值