• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
kerlook
博客园    首页    新随笔    联系   管理    订阅  订阅
Hive基础

Hive

概念:

​ 是由Facebook开源用于解决海量结构化日志数据统计的工具

​ 是一个基于hadoop的数据仓库工具可以将结构化的数据映射成一张二维表提供sql语句

​ 本质是将sql语句映射到MapReduce上 进行分布式计算

​ 数据存储在hdfs上、底层分析用mapreduce进行分析 、执行程序在yarn上 元数据存储在第三方

​ hive没有索引所以在查询的时候延迟高还有因为MapReduce本身延迟就很高

优点:

​ 用类似于sql语句进行操作上手快

​ 不用写MapReduce 减少开发人员的消耗

​ 适合处理大数据集不适合处理小数据集

​ 用户可以根据自己的需求来定义函数

​ 离线计算 不能实时计算

缺点:

​ 迭代试算法无法表达

​ 数据挖掘方面不擅长 由于MapReduce的处理流程的限制

数据类型:

​ tinyint 位整形 1byte boolean 布尔型 timestamp 时间类型

​ smalint 短整型 2yte float 单浮点型 binary 字节数组

​ int 整形 4byte double 双精度浮点数

​ bigint 长整型 8byte string 字符串 类型

集合数据类型:

​ struct 结构体 用点来访问元素 第一个可以用。first来访问

​ map 键值对集合 可以使用键来访问元素

​ array 具有相同类型和名称的变量集合

定义表:

​ row format delimited fields terminated by 列分隔符

​ collection items terminated by ' ' map、struct array 分隔符

​ map keys terminated by ':' map中key与value分隔符

​ lines terminated by '\n' 行分隔符

类型转化:

​ 隐世类型转化: 任何整形类型都可以隐式转化为范围更广的类型

​ 所有整形类型、float \ string类型 都可以隐式转换为double类型

​ tinyint samllint 、int 都可以转化为float类型

​ boolean 类型不能转化为任何类型

​ 强行转换 :使用cast操作进行数据类型的转换

​ 例如 使用cast('1' as int ) 吧字符串转换成整数 如果转化失败返回一个null值

创建库

​ create database [if not exists ] database_name

​ [comment database_comment] 对于表的注释

​ [location dfs_path] 数据库的存储地址

​ [with dbproperties property_name=property_value ] 属性的配置

​ 创建数据库的默认地址 是 user/hive/warehouse/*.db

创建表

​ create [external] table [if not exists] table_name

​ [(col_name data_type [comment col_comment,...])]

​ [comment table_comment]

​ [partitionend by (col_name data_type [comment col_comment],....)]

​ [clustered by (col_name data_type...)

​ [sorted by (col_name [asc|desc],...)] into num_buckets buckets]

​ [row format orw_format]

​ [stored as file_format]

​ [location hdfs_path]

​ [talproperties (property_name=property_value,....)]

​ [as select_statement]

​ 字段解释:

​ 1、 create table 创建一个表 如果这个表已经有了用[if not exists ] 来抛出异常

​ 2、[external] 创建一个外部表 在删除表的时候值删除元数据 内部表删除数据和元数据

​ 3、comment 为表或者列来加注释

​ 4、partitioned by 创建分区表

​ 5、clustered by 创建分桶表

​ 6、sorted by 不常用你 对于桶中的一个或多个列进行排序

​ 7、row format delimited [fields terminated by ''] 字段之间分割[collection items terminated by ''] 集合之间分割 [map keys terminated by ''] map和值之间的分割 [liens terminated by '' ] 行之间分割 不写就用默认的

​ 8、stored as 指定类型 sequencefile 二进制序列文件 textfile 文本文件 rcfile 列式存储格式文件

​ 9、 location 指定存储位置

​ 10、 as 后面跟查询语句 查询结果创建表

​ 11、like 允许用户复制现有的表结构不能复制数据

各种函数使用

​ concat 两个字符串直接连接

​ concat_ws (separator,str1,..) 中间参数指定字符分开 连接

​ collect_set(col) 指定分割 返回集合 多行换成一行

​ collect_list(col) 转化成列表

​ nvl(field,null) 空字段赋值 如果为空返回默认是

​ case where 判断
​ split(str,regex) 函数 正则表达式切分给定的字符串
​ explode 转成列 炸裂函数

​ lateral view 侧视图

​ UDTF :用户定义一进多出函数

​ UDAF : 用户定义多进一出

​ UDF : 一进一出函数

​

order by 和sort by & distribute by

​ order by asc 升序 默认 desc 升序 全局排序效率慢

​ sort by 局部分区

​ MapReduce 内部排序 sort by 对于大数据集来说orderby d的效率比较低 在很多情况下不需要 全局排序

​ 这个排序对于全局来说不是排序的

distribute by 分区排序

​ 分区规则是根据字段的hash码与reduce的个数进行取余分到一个区的 distribute by 要求sort by后面

​ 因为我们用的mapreduce所以在生成的时候他们只对map阶段的分区来进行排序 在总结到一起的时候不会是全局有序的他们每个分区的大小是根据hash值&一个整形最大值

1、Load data 各参数意义

​ load data local inpath "path" into table tab_name partition= “”;

​ load data 表示加载数据 local 表示从本地 inpath 表示路径 “ ”

​ into table 表示 写到那张表中 partition 表示分区

​

2、管理表与外部表的互相转换

​ alter table tab_name set tblproperties(external=false) 外部切换到分区

​ alter table tab_name set tblproperties(external=true) 管理切换到外部

3、什么是管理表

​ 管理表把元数据和 真是数据结合在一起 如果我们吧这个表删了 真是数据也会删除 适合长期数据

4、什么是外部表

​ 外部表把元数据和真实数据分开来 如果我们吧删除表只有元数据丢失 我们真是数据还会存在hdfs上

​ 适合短暂时间要用到的一些日志 或者数据

5、什么是分区表

​ 分区表就是把大数据集切分成n份 在使用的时候是按区来进行的 在hdfs上主要就是文件夹 这样查找的速度会快 并且表中的数据实际并不包含分区数据

6、分区表优势

​ 在存储的时候可以分区存储 和计算的时候可以分区计算 并行计算让分区表速度加快 逻辑性强伴随而来的是排序的时候会按区来排序 达不到全局排序 隔离性强

开窗函数*

​ 可以单独为聚合函数指定位置

范围限定

​ over() 决定窗口大小

​ current row 当前行数据

​ n preceding 向前n行

​ n following 向后n行

​ unbounded preceding 起点

​ unbounded fllowing 终点

​ order by 有序

​ partition by 分组

函数

​ lag(col,n,default_value) 前第两行数据 在有序窗口使用

​ lead(col,n,default_value) 向后 有序窗口

​ ntile(n) 将数据分为n组 需要是有序窗口

​ percent _ rank() 显示该条记录占窗口数据的百分比

排名函数

​ rank()--> 排序相同的时候重复但总数不会变

​ dense_rank() --》 排序的时候相同会重复 但总数汇编

​ row_number() --》 会根据顺序计算

日期函数

​ current_date --》当前日期

​ data_add(start_date,num- days) 返回 开始日期后n天日期

​ date_sub(date1,date2) 日期差

​

​

​

posted on 2020-11-25 21:09  kerlook  阅读(112)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3