Hive基础应用

一.hive基础概念

1.数据模型

在这里插入图片描述

分区:按照表之外的虚拟字段将一个大表分成多个小表,例如按照年份进行分割
分桶:按照表中的真实字段的hash值将表进行分割
目的:都是为了提高数据处理的效率

2.数据类型

  • 数值类型

    • 在这里插入图片描述
  • 日期类型

    • 在这里插入图片描述
  • 字符类型

    • 在这里插入图片描述

    • varchar和char的联系

      • 相同点
        • 都是存储字符串的
      • 不同点
        • varchar是变长,char是定长
      • 应用场景
        • varchar一般用于用户名等长度不固定的数据存储
        • char一般用于手机号等定长的数据存储
  • 布尔类型

    • 在这里插入图片描述
  • 字节数组

    • 在这里插入图片描述
  • 复杂类型

    • 在这里插入图片描述

3.数据操作分类

  • DDL(数据定义语言)

    • 在这里插入图片描述
  • DML(数据操作语言)

    • 在这里插入图片描述
  • DQL(数据查询语言)

    • 在这里插入图片描述

二.Hive SQL

1.DDL

  • 内表与外表
    • 内表:元数据和数据本身都由hive管理,删除表会将数据和数据本身都删除
    • 外表:元数据由hive管理,数据本身由hdfs管理,删除表只会删除元数据,数据本身不会影响
  • 建表模板
CREATE [external] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [comment col_comment], ...)]
[comment table_comment]
[partitioned by (col_name data_type [comment col_comment], ...)]
[clustered by (col_name, col_name, ...)[sorted by (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[row format row_format]
[stored as file_format]
[location hdfs_path]
  • 名词解释
    • external 区分内外表的唯一标识
    • partitioned by 分区字段,0-n个
    • clustered by 分桶字段0-n个
    • row format 行分割符号
    • stored as 存储的文件格式txt或者orc
    • location hdfs文件的存储路径,不指定会在hive指定的默认路径中
  • 示例
CREATE  TABLE student(
id string comment '学号',
username string comment '姓名',
classid int comment '班级id',
classname string comment '班级名称'
)
comment '学生信息主表'
partitioned by (come_date string comment '按入学年份分区')
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\001' 
LINES TERMINATED BY '\n'
STORED AS  textfile;

2.DML

1.加载本地数据

LOAD DATA local INPATH './student.txt' OVERWRITE INTO TABLE student PARTITION (come_date=20170903);

注意:新版的hive已经不支持加载本地数据了

2.加载hdfs数据

LOAD DATA INPATH '/tmp/tianliangedu/input_student_info/student.txt' OVERWRITE INTO TABLE student PARTITION (come_date=20170904);

注意:原始的hdfs文件数据将被move到目标表的数据目录当中,注意源文件目录和目标文件目录的权限。

3.将查询结果插入到数据表中

insert overwrite table student partition(come_date='20170905')
select
id,username,classid,classname 
from student 
where come_date='20170904';

4.多插入模式

一次查询多次插入

from student
insert overwrite table student partition(come_date='20170906') select id,username,classid,classname where come_date='20170905'
insert overwrite table student partition(come_date='20170907') select id,username,classid,classname where come_date='20170905'
insert overwrite table student partition(come_date='20170908') select id,username,classid,classname where come_date='20170905'

5.动态分区模式

让分区成为被查询出来的结果表的字段名称变量
设置非严格模式

set hive.exec.dynamic.partition.mode=nonstric;
insert overwrite table student partition(come_date)  
select id,username,classid,classname,come_date from student_outer

6.将查询结果写入到hdfs目录中

insert overwrite directory "/tmp/output2/" 
select * from student where come_date='20170905';

7.内外表的创建规则

  • 如果表数据是外部load过来的,即为不可hive内部自生成,此时的表必须是外表。
  • 如果表数据是hive内部可以自生成的,即不需要依赖外部的load数据,则此时的表应该是内表。

3.DQL

1.模板

SELECT [DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list [HAVING condition]]
[ CLUSTER BY col_list
   | [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]
]
[LIMIT number]
  • DISTRIBUTE BY col_list

以指定字段作为key作hash partition,保证相同的key会到同一个reduce去处理。

  • Sort By col_list

以指定字段作为单个reduce排序的key,保证单个reduce内的key有序排列输出。

  • Order By col_list

只会生成一个reduce任务,对全部排序

  • CLUSTER BY col_list
    ol_list

以指定字段作为key做hash partition,保证相同key会到同一个reduce去处理。该命令相当于distributed by col_list和sort by col_list的联合使用。

2.连接查询

inner join
left join
right join
full join

3.union

union all 将所有表数据,完全叠加在一起,不去重
union 将所有表数据,完全叠加在一起,去重

4.hive中的一些注意点

  • 子查询的时候必须给别名
  • Null判断要用is
  • 不支持update,delete操作

三.hive系统函数

  • 查看所有的函数
    • show functions;
  • 函数分类
    • ![image.png](https://img-blog.csdnimg.cn/img_convert/6d105b8249724a84904636ec43825410.png#clientId=u5fef0458-cad1-4&from=paste&height=375&id=u18980a28&margin=[object Object]&name=image.png&originHeight=400&originWidth=718&originalType=binary&ratio=1&size=86244&status=done&style=none&taskId=u8817a17b-5bb9-46e2-af0c-1cb6a6de06b&width=674)
  • 查看一个函数的说明
    • desc function split;
  • 一些常用的函数
    • count() 统计
    • if if(Test Condition, True Value, False Value)
    • COALESCE( value1,value2,… )将参数列表中第1个不为null的值作为最后的值
    • case…when
CASE  [ expression ] 
  WHEN condition1 THEN result1 
  WHEN condition2 THEN result2 
  ... 
  WHEN conditionn THEN resultn 
  ELSE result 
END
  • split 将字符串拆分成一个数组
  • explode 将一个集合元素,打散成一行一行的组成,即将一行改成多行
  • lateral view 与explode联用,形成一张新表
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Antgeek

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值