2. Hive和数据库比较
Hive和数据库除了拥有类似的查询语言,再无类似之处
-
数据存储位置
-
Hive存储在HDFS上,数据库将数据保存在块设备或者本地文件系统中
-
-
数据更新
-
Hive默认不支持update,delete操作,需要开始事务配置。一般场景不建议使用跟新。mysql支持更新删除操作。如果在hive中需要update。可以insert into 新表 select 字段1,字段2,if(更新条件,返回,否则返回)from 旧表
-
-
执行延迟
-
Hive执行延迟较高,数据库的执行延迟较低。这个是有条件的,在数据规模较小时,在数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。
-
-
数据规模
-
Hive支持很大规模的数据计算,数据库可以支持的数据规模较小。
-
-
SQL语法区别: 1 hive不支持where后面跟子查询。 2 hive支持建表分区操作,mysql不支持。 3 group by。hive中sql,select 中的维度字段,必须出现在group by 后面。mysql语法可以不用。 省份,城市,确诊病例 select pro,city,sum(quezhen) s from t group by pro,city 4 sort by,distribute by,group by 5 mapjoin ,mysql没有。
3. 内部表和外部表
内部表和外部表的区别在于元数据和原始数据
-
删除数据时:
-
内部表:元数据和原始数据全部删除
-
外部表:只删除元数据
-
-
在公司生产环境下,什么时候创建内部表,什么时候创建外部表?
-
在公司中绝大多数场景都是创建外部表
-
自己使用的临时表,才会创建内部表
-
4. 4个By的区别
在生产环境中order by用的较少,容易导致OOM
在生产环境中sort by+distribute by用的多
-
order by:全局排序,只有一个reduce
-
sort by:分区内有序
-
distribute by:类似于MR中partition,进行分区,结合sort by使用
-
cluster by:当distribute by和sort by字段相同的时候,可以使用cluster by方式。cluster by除了具有distribute by的功能外还兼具了sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。
5.系统函数
-
date_add、date_sub函数(加减日期)
-
next_day函数(周指标相关)
-
date_format函数(根据格式整理日期)
-
last_day函数(求当月最后一天日期)
-
collect_set函数
-
get_json_object解析json函数
-
NVL(表达式1,表达式2)
-
如果表达式1为空值,NVL返回值为表达式2的值,否则返回表达式1的值。
-
6.自定义UDF、UDTF函数
-
在项目中是否自定义过UDF、UDTF函数,以及用他们处理了什么问题,及自定义步骤?
-
用UDF函数解析公共字段,用UDTF函数解析事件字段
-
自定义UDF:继承UDF,重写evaluate方法
-
自定义UDTF:继承自GenericUDTF,重写3个方法:initialize(自定义输出的列名和类型),process(将结果返回forward(result)),close
-
-
为什么要定义UDF、UDTF?
-
因为自定义函数,可以自己埋点Log打印日志,出错或者数据异常,方便调试
-
有些需求SQL无法直接处理,可以使用代码辅助解决
-
7.窗口函数
-
Rank
-
Rank()排序相同时会重复,总数不会变
-
rank() over(partiition by regionX order by nameX desc) as tn
-
1 93;2 90;2 90;4 89 排名不是连续的,相同的分数是同名次,前 100 名只有 100 个
-
-
dense_rank()排序相同时会重复,总数会减少
-
dense_rank() over()
-
1 93;2 90;2 90;3 89 排名是连续的,相同的分数是同名次,前 100 名可能多于 100 个
-
-
row_number()会根据顺序计算
-
row_number() over(partition by regionX order by nameX desc) as tn
-
1 93;2 90;3 90 排名是连续的,相同的分数会有排名先后,前 100 名只有 100 个
-
-