hive111

hive111 ******hive的架构存储meta的MySQL储存原始数据的HDFS执行引擎MRhive客户端driverclientjdbc编译器解析器优化器执行器******hive sql转成mr流程1.首先解析器将HQL转换为为AST抽象语法树2.遍历AST进一步抽象出QueryBlock查询块3.遍历QueryBlock将其转换为OperatorTree执行操作树也就是逻辑执行计划4.逻辑优化器对OperatorTree执行操作树进行逻辑优化。例如合并不必要的ReduceSinkOperator减少Shuffle数据量比如map端的预聚合map join5.遍历OperatorTree转换为mr任务。6.使用物理优化器对mr任务进行物理优化7.生成最终的执行计划提交任务到Hadoop集群运行。******hive与mysql的区别共同点二者有相似的查询语言区别hive把数据存储在hdfs上mysql式存在块设备或本地文件系统中hive不建议对数据改写mysql的数据通常要进行修改hive执行延迟高hivesql转为mr程序要走一系列流程最后提交去申请资源运行mysql执行延迟低mysql就是在数据库实例内部直接执行的但如果数据量大到一定规模的时候hive的并行计算的优势就能体现出来******内外部表内部表创建时默认的在内部表被删除后表的元数据和表数据都从HDFS中完全删除外部表在删除表之后只有与表相关的元数据被删除而不会删除表的内容。应用场景在公司中绝大多数场景都是外部表自己使用的临时表才会创建内部表原始日志表使用外部表统计分析过程中用到的中间表和结果表使用内部表存储******hive炸裂函数hive中炸裂函数有两个explode和posexplode都是可以把数组类型或map类型的字段拆分成多行属于udtf函数posexplode函数是explode函数的增强版。除了展开数组或映射类型的列它还会返回每个元素在原始数组或映射中的位置索引******hive解析json1.用get_json_object函数$.age2.创建表的时候添加serde来创建适合表的每一行都是标准的json这种方法可以直接查json里面的字段*****hive的优化1.使用分区裁剪列裁剪。列裁剪就说在查询时只读取需要的列分区裁剪就是只读取需要的分区减少数据量读取2.开启map端完成部分聚合减少shuffle的数据量默认开启3.合理设置map数过低慢并行不足过高文件切的太小启动耗时合理设置reduce数过低效率低资源利用低慢过多合并开销多启动调度消耗大产生大量小文件4.hive小文件的优化可用看作是hdfs小文件的处理reduce并行度设置不合理的话就可能导致计算结果出现大量的小文件可由小文件合并任务解决原理是根据计算任务输出文件的平均大小进行判断若符合条件则单独启动一个额外的任务进行合并5.启用谓词下推尽量将过滤操作往前移减少后续计算步骤的数据量6.启用并行执行hive会将一个sql分为一个或多个stage每一个stage对应一个mr job默认情况下hive同时只会执行一个stage但有的时候多个stage并非完全相互依赖也就是说可以并行执行7.启用压缩减少磁盘IO8.分区分桶创建分区表防止后续全表扫描创建分桶表对未知的复杂的数据进行提前采样 数据倾斜单独说cbo优化基于计算成本的优化主要用于join的优化******hive数据倾斜hive中的数据倾斜通常出现在分组聚合和join操作的场景中分组聚合的倾斜原因groupby的字段的值分布不均1.启用map-side聚合2.启用Skew-groupby就是启动两个mr任务第一个mr按照随机数分区将数据分散发送到reduce并完成部分聚合第二个mr按照分组字段分区完成最终聚合join的倾斜原因关联字段的值分布不均1.启动map join避免了reduce适用于小表join大表,若是大表join大表就用Skew join******hive分区hive中的一个分区对应的就是hdfs的一个目录目录名就是分区字段******hive去重distinct和group by******hive有哪些文件存储格式及其对比默认的是textfile存储格式orc列式存储行组存储格式压缩比比较高parquet列式存储二进制存储orc相比对parquet的优点orc压缩比更高orc有轻量级索引在复杂查询和定位数据时更有优势orc是hive原生的支持格式与hive功能结合更好******hive两个表join过滤条件在on后边和where后边有哪些不同筛选条件放在on的后面是先进行筛选后进行连接查询。筛选条件放在where的后面是先进行连接查询后进行筛选。******hive窗口函数窗口函数能为每行数据划分一个窗口然后对窗口范围内的数据进行计算最后将计算结果返回给该行数据常用窗口聚合maxminsum跨行取值lag获取上一行的某个字段值lead获取下一行的某个字段值first_value(获取某一列的第一个值)last_value获取某一列的最后一个值排名函数rank比如对10010099排名就是113dense_rank112row_number:123******hive有几种join方式三种1.map-join小表join大表2.reduce-join也就是common join在reduce端完成join3.SMB join大表join大表******hive怎么实现行转列列转行行转列concat可以拼接两个列到成一个列collect_set可以将某列的值去重产生数组类型的字段列转行split将字符串按照分隔符转成数组结构explode可以将数组结构或map结构给拆分成多行******有用java在hive里面写过自定义函数吗udf udtfudf一进一出udtf一进多出udaf多进一出逻辑不是特别复杂的就没用用自定义函数优点可以灵活的实现业务需求******hive的sort by和order by的区别order by全局排序只有一个reducer自己设置reducer的数量不会生效sort by是对同一个reducer上收到的数据进行排序如果使用超过一个reducer那给出的结果就是可能部分有序的结果distribute by控制map的输出在reducer中是如何划分的cluster by除了有distri的功能外还能对该字段进行排序等价于 distri colsortby col补充order by deptnosal 等价于 distribute by deptno sort by sal******补充并行执行案例下面这个案例会有3个stage两个分组聚合的一个join的默认情况下是同时执行一个stage这个可以通过yarn的UI上去看同时只有一个stage在运行但是两个分组聚合的stage是没有相互依赖的所以可以开启并行执行资源充足就会同时执行这两个stage也是通过yarn的UI看的开启后同时执行了两个stage