Hive相关资料

1.Hive外部表与内部表

  • 被External修饰的为外部表(external table),反之为内部表(managed table) 默认情况下是内部表(MANAGED_TABLE)
  • 内部表数据由Hive自身管理, 外部表数据由HDFS管理
  • 内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse)
  • 外部表(External Table) 创建的时候需要加上External关键字, 并指定存储位置;
  • 删除内部表会把元数据以及存储数据都会被删除掉, 而删除外部表, 只会删除元数据信息,HDFS上的文件不会被删除掉
  • 对内部表的修改会直接同步给元数据, 而对外部表的表结构和分区修改需要修复(MSCK REPAIR TABLE table_name);

2.Hive的排序分组方法

  • 这个方法是帮助用户减少工作量
  • 除Row_number外还有rank,dense_rank
CREATE TABLE user_order(
	user_id int COMMENT '用户ID'
	pro_id int COMMENT '产品ID',
	value STRING COMMENT '价格' 
)

查出每个用户买的价值最高的两个用品,如果不用row_number费点时间也是可以写出来的,但是用row_number就比较快捷:

SELECT user_id,pro_id,value FROM (
	SELECT user_id,pro_id,value,
		row_number() over (PARTITION BY user_id OREDER BY value DESC) as flag
		WHERE flag<=2
);

以下是语法:

rank() over([partition by col1] order by col2)
dense_rank() over([partition by col1] order by col2)
row_number() over([partition by col1] order by col2)

功能差不多,但是有细微的差别

  • rank排序时出现相等的值时会有并列,即值相等的两条数据会有相同的序列值1,1,2,3,4
  • row_number的排序不允许并列,即使两条记录的值相等也不会出现相等的排序值1,2,3,4
  • dense_rank排序的值允许并列,但会跳跃的排序,像这样:1,1,3,4,5,5,7.

3.Hive中窗口函数

  • OVER(): 指定分析函数工作的数据窗口大小, 这个数据窗口大小可能会随着行的变化而变化
格式:
	分析函数 over(partition by xxx  order by xxx [asc | desc])
	
使用位置: 在select后 from 前面

4.Hive的HiveSQL转换为MapReduce的过程?

  • 基本转换步骤
    hiveSQL转换成MapReduce的执行计划包括如下几个步骤:
HiveSQL ->AST(抽象语法树) -> QB(查询块) ->OperatorTree(操作树)->优化后的操作树->mapreduce任务树->优化后的mapreduce任务树

5.写出hive中split、coalesce及collect_list函数的用法

split将字符串转化为数组,即:split('a,b,c,d' , ',') ==> ["a","b","c","d"]coalesce(T v1, T v2,) 返回参数中的第一个非空值;如果所有值都为 NULL,那么返回NULL。
collect_list列出该字段所有的值,不去重  select collect_list(id) from table。

6.Hive内部表和外部表的区别?

  • 被External修饰的为外部表(external table),反之为内部表(managed table) 默认情况下是内部表(MANAGED_TABLE)
  • 内部表数据由Hive自身管理, 外部表数据由HDFS管理
  • 内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse)
  • 外部表(External Table) 创建的时候需要加上External关键字, 并指定存储位置;
  • 删除内部表会把元数据以及存储数据都会被删除掉, 而删除外部表, 只会删除元数据信息,HDFS上的文件不会被删除掉
  • 对内部表的修改会直接同步给元数据, 而对外部表的表结构和分区修改需要修复(MSCK REPAIR TABLE table_name);

7.Hive如何权限控制。

目前hive支持简单的权限管理,默认情况下是不开启,这样所有的用户都具有相同的权限,同时也是超级管理员;
Hive可以是基于元数据的权限管理,也可以基于文件存储级别的权限管理。
如果Hive需要控制权限,就需要在hive-site.xml中进行配置
Hive支持以下角色: 用户(user)、组(group)、角色(role)。

8.详述数据仓库缓慢变化维问题及Hive拉链表如何实现思路

  • 缓慢渐变维
    作用: 是用于记录表中数据的历史变化信息
    • 方案一(SCD1): 不维护历史变化的数据, 对于变更数据,是直接采用覆盖的方式
      • 适用于: 原本数据存在问题, 此时直接覆盖修改即可
    • 方案二(SCD2): 拉链表 维护历史变化的数据, 在拉链表中会产生两个新的字段. 一个数据生效时间, 一个数据截止时间, 当数据发生修改后, 在拉链表插入一条新的变更后的数据,然后将原有数据的截止时间, 设置变更数据日期上一天即可
      • 优点: 实现起来比较的便捷, 利用维护, 可以记录多个历史版本
      • 弊端: 会产生冗余数据
    • 方案三(SCD3): 仅能维护较少历史变化版本的数据, 当数据发生变更后, 对表新增一列新的字段, 在新的字段记录上变更后的数据即可
      • 优点: 减少冗余数据的出现
      • 弊端: 不能够维护更多的历史版本, 不利于后续维护, 效率比较的低

9.Hive的动态分区和静态分区?使用动态分区两个具体事项?

  • Hive的动态分区和静态分区
    静态分区:手动指定分区名
    动态分区:根据查询语句自动生成的分区名
    详细来说,静态分区的列实在编译时期,通过用户传递来决定的;动态分区只有在SQL执行时才能决定。
    静态分区: 有可能存在某一个分区中一条数据都没有
    动态分区:每一个分区至少有一条数据
    动态分区比静态分区的方式消耗性能,默认严格下动态分区至少有一个静态分区。
    insert 方式只存储表字段,不存储分区字段
    分区表查询的时候,将分区字段看做普通字段进行查询就可以了
  • 使用动态分区两个具体事项
    默认情况下,动态分区是关闭的,需要手动开启
    并且开启非严格模式;
set hive.exec.dynamic.partition=true;#开启动态分区
set hive.exec.dynamic.partition.mode=nonstrict;#允许所有分区都是动态的

10.教育项目数据仓库是如何设计数据分层的,一共包括几个部分的看板?

  • 设计数据分层
    我们是按照三层模式进行分层
    ODS层: 源数据层;(建表的时候, 一般构建都是外部表)
    DW层: 数据仓库层(建表的时候: 一般构建都是内部表)

    • DWD层: 明细层
      • 作用: 根据要分析的主题, 从ODS层将数据抽取出来, 主要用于对数据进行清洗 转换的操作, 同时也可以做一些少量维度退化(在ODS层存在当前主题的维度表)的操作
      • 说明:
      主要是对事实表进行操作: 
      1) 此层主要的工作:  清洗  转换
      2) 如果当前要分析:的主题的维度表, 被放置在ODS层, 此时在DWD层也要进行维度退化, 否则不做
      
    • DWM层: 中间层
      • 作用: 主要是用于对DWD层数据以及结合维度表进行维度退化的操作, 同时还要提前聚合的操作(周期快照事实表)
      • 说明:
      	1) 主要是用于进行维度退化操作.如果维度表都在ODS层 此时DWD以及帮助完成了, 此时此层可		以省略
      	2) 要进行提前聚合操作, 形成周期快照事实表, 此操作在使用的时候, 一定要进行可行性分析
      
    • DWS层:

    APP/DA层: 数据应用层(建表的时候: 一般构建都是内部表)

    • 作用: 如果需要对DWS结果表进行再次的统计分析,此时得出的结果数据需要存储在APP层, 否则可以省略
  • DIM层: 维度层

    • 作用: 用于存储维度表数据
  • 一共包括几个部分的看板?

    1. 访问咨询主题看板
    2. 意向用户主题看板
    3. 有效线索主题看板
    4. 报名用户主题看板
    5. 学生考勤主题看板

11.大数据项目是如何组织的?请以一个看板为例梳理业务看板具体的构建流程及思路?

访问咨询主题看板为例:

  • 首先我们拿到需求后先进行需求分析->建模分析->建模操作,
  • 通过访问咨询主题看板的需求分析我们能够获得: 各个小需求.
  • 通过各个小需求分析我们可以获得: 维度字段,指标字段,涉及表, 涉及到的字段等信息
  • 总结出我们固有维度, 产品维度, 指标字段, 涉及到的表, 涉及到的字段,
  • 通过需求分析我们能够得到各个表的字段以及分区等信息
  • 通过f
  • 将mysql中的源数据通过sqoop将其导入到hive中

12.Hive实现WordCount案例

(1)创建一个文件,将文件写入
vim data.txt

hello kity
hello
lala
jililili
liyanting liyanting
balabala balalaalalalalalalal
word
hello kity
hello
lala
jililili
liyanting liyanting
balabala balalaalalalalalalal
word
hello kity
hello
lala
jililili
liyanting liyanting
balabala balalaalalalalalalal
word
ppppppp

(2)创建一个表用来存放数据

    hive>create table wordcount(line string)
        > row format delimited
        > fields terminated by ',';

(3)将data.txt文件加载到wordcount表中

hive> load data local inpath '/root/data.txt' into table wordcount;

根据MapReduce的规则,我们需要进行拆分,把每行数据拆分成单词,这里需要用到一个hive的内置表生成函数(UDTF):explode(array),参数是array,其实就是行变多列:
(4)再创建一个表放切割完数据的

hive> create table jishu(danci string);

(5)将表中数据切割成独立的单词,然后加载到jishu表中

hive> insert into table jishu select explode(split(line," ")) as danci from wordcount;

(6)查看

hello
kity
hello
lala
jililili
liyanting
liyanting
balabala
balalaalalalalalalal
word
hello
kity
hello
lala
jililili
liyanting
liyanting
balabala
balalaalalalalalalal
word
hello
kity
hello
lala
jililili
liyanting
liyanting
balabala
balalaalalalalalalal
word
ppppppp

(7)最后统计语句为:

select danci,count(*) from jishu group by danci;
balabala	3
balalaalalalalalalal	3
hello	6
jililili	3
kity	3
lala	3
liyanting	6
ppppppp	1
word	3

13.行转列案例需求

如何将
a b 1,2,3
c d 4,5,6
变为:
a b 1
a b 2
a b 3
c d 4
c d 5
c d 6

SELECT clum1, clum2, clum3
from tabName
lateral view explode(split(clum3,’,’)) cr as clum3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值