当前位置: 首页 > news >正文

网站使用教程天津专业的网站建设公司

网站使用教程,天津专业的网站建设公司,网站空间 数据库,孟坤WordPress博客主题模板0. 思维导图 1. 简述Hive♥♥ 我理解的#xff0c;hive就是一款构建数据仓库的工具#xff0c;它可以就结构化的数据映射为一张表#xff0c;并且可以通过SQL语句进行查询分析。本质上是将SQL转换为MapReduce或者spark来进行计算#xff0c;数据是存储在hdfs上#xff0c;…0. 思维导图 1. 简述Hive♥♥ 我理解的hive就是一款构建数据仓库的工具它可以就结构化的数据映射为一张表并且可以通过SQL语句进行查询分析。本质上是将SQL转换为MapReduce或者spark来进行计算数据是存储在hdfs上简单理解来说hive就是MapReduce的一个客户端工具。 补充1你可以说一下HQL转换为MR的任务流程吗♥♥♥ 首先客户端提交HQL以后hive通过解析器将SQL转换成抽象语法树然后通过编译器生成逻辑执行计划再通过优化器进行优化最后通过执行器转换为可以运行的物理计划比如MapReduce/spark然后提交到yarn上执行详细来说 首先客户端提交SQL以后hive利用Antlr框架对HQL完成词法语法解析将HQL转换成抽象语法树然后遍历AST将其转换成queryblock查询块可以理解为最小的查询执行单元比如where然后遍历查询块将其转换为操作树也就是逻辑执行计划。然后遍历优化器对操作树进行逻辑优化源码中会遍历所有的优化方式比如mapjoin谓词下推等来达到减少MapReduce Job减少shuffle数据量的目的。最后通过执行器将逻辑执行计划转换为物理执行计划MR到这就结束了spark还需要使用物理优化器对任务树进行物理优化提交到hadoop集群运行。 补充2你可以说一下hive的元数据保存再哪里吗 默认是保存java自带的derby数据库但是这有一个缺点derby数据库不支持并发也就是说不能同时两个客户端去操作derby数据库因此通常情况下都会配置一个mysql去存放元数据。 2. 简述Hive读写文件机制 读取文件 首先调用InputFormat默认TextInputFormat对文件进行逻辑切片返回一条一条的kv键值对然后调用SerDeLazySimpleSerDe的反序列化方法将一条记录中的value根据分隔符切分为各个对应的字段。 写文件 首先调用SerDe默认LazySimpleSerDe的序列化方法将对象序列化为字节序列然后调用OutputFormat将数据写入HDFS文件中。 3. Hive和传统数据库之间的区别♥♥♥ 我认为主要有散点的区别 数据量hive支持大规模的数据计算mysql支持的小一些数据更新快不快hive官方是不建议对数据进行修改的因为非常的慢这一点我也测试过而mysql经常会进行数据修改速度也挺快的。查询快不快hive大多数延迟都比较高mysql会低一些当然这也与数据规模有关数据规模很大的时候hive不一定比mysql慢。 为什么处理小表延迟比较高 因为hive计算是通过MapReduce而MapReduce是批处理高延迟的。hive的优势在于处理大数据对于处理小数据是没有优势的。 4. Hive的内部表和外部表的区别♥♥♥ 从建表语句来看加上了external关键字修饰的就是就是外部表没加的就是内部表。 我认为主要有两点的区别 内部表的数据由hive自身管理外部表的数据由hdfs管理。删除内部表的时候元数据和原始数据都会被删除而删除外部表的时候仅仅会删除元数据原始数据不会被删除。 使用场景通常都会建外部表因为一个表通常要多个人使用以免删除了还可以找到数据保证了数据安全。 5. Hive静态分区和动态分区的区别 分区表也叫分区裁剪就是分目录作用就是减少全表扫描。 建表的时候partitioned by (day string) 加载数据的时候partition(day“20210823”)【静态分区】或者partition(day)【动态分区】。 分区字段不能是表中已经存在的字段。 静态分区 分区字段的值是在导入数据的时候手动指定的导入数据的方式可以是load data方式也可以是insert into select 方法 动态分区 分区字段的值是基于查询结果自动推断出来的也就是最后查询结果的最后一个字段值就对应分区字段的值。导入数据的方式必须是insert into select 方式想使用动态分区表的时候必须要对hive进行两个配置 开启动态分区功能 hive.exec.dynamic.partitiontrue设置动态分区的模式为非严格模式也就是说允许所有分区字段都可以使用动态分区hive.exec.dynamic.partition.modenonstrict 补充题你知道分桶表吗谈谈这两个的区别 分桶表和分区表的作用都是用来减少全表扫描的那么有了分区表为啥还要有分桶表呢 因为并非所有的数据都可以进行合理的分区所以有了新的技术分桶表 分桶表的分桶规则是根据分桶字段的hash值对桶的个数进行取余运算然后得到该数据应该放到哪个桶里面去 说了这么多他们有什么区别呢 创建语句不同分区表是partitioned by分桶表是clustered by分区或分桶字段要求不同分区字段不能是表中存在的字段分桶字段一定是表中存在的字段。表现形式不同分区表其实就是分了目录存放数据分桶表是将一个文件拆分为很多文件存放。 6. 内连接、左外连接、右外连接的区别 内连接返回的是两个表的交集。左外连接返回左表的所有行如果左表的某行在右表没有匹配行则将右表返回空值。右外连接返回右表的所有行如果右表的某行在左表没有匹配行则将左表返回空值。 7. Hive的join底层实现♥♥♥ 首先hive的join分为common join 和map joincommon join 就是join发生在reduce端map join就是join发生在map端 common join: 分为三个阶段map阶段、shuffle阶段、reduce阶段 map阶段对来自不同表的数据打标签然后用连接字段作为key其余部分和标签作为value,最后进行输出shuffle阶段根据key的值进行hash这样就可以将key相同的送入一个reduce中reduce阶段对来自不同表的数据进行join操作就可以了 map join: 首先它是有一个适用前提的适用于小表和大表的join操作小表多小为小呢所有就有了一个参数进行配置hive.mapjoin.smalltable.filesize25M它的原理是将小表复制多份让每个map task内存存在一份比如我们可以存放到HashMap中然后join的时候扫描大表对于大表中的每一条记录key/value,在HashMap中查找是否有相同的key的记录如果有则join连接后输出即可因为这里不涉及reduce操作。0.7版本之后都会自动转换为map join如果之前的版本我们配置一个参数就可以了hive.auto.convert.jointrue。 8. Order By 和 Sort By的区别♥♥ distribute by: 将数据根据by的字段散列到不同的reduce中 cluster by:当distribute by 和sort by 字段相同的时候等价于cluster by ,但是排序只能是升序。 order by全局排序只有一个reducer缺点当数据规模大的时候就会需要很长的计算时间。sort by分区排序保证每个reducer内有序一般结合distribute by来使用使用场景在生产环境中order by 用的比较少容易导致OOM一般使用distribute by sort by 9. 行转列和列转行函数♥ JSON解析函数 get_json_object每次只能返回json对象中的一列值 select get_json_object(data,‘$.movie’) as movie from json;json_tuple每次可以返回多列的值 select b.b_movie, b.b_rate,b.b_timeStamp,b.b_uid from json lateral view json_tuple(json.data,‘movie’,‘rate’,‘timeStamp’,‘uid’) b as b_movie,b_rate, b_timeStamp,b_uid; 如果是json数组的话那么就不能直接使用上述的操作我们可以先使用regexp_replace方法进行字符串的替换将它处理成多个json然后再使用上述的方法就可以了。 URL解析函数HOST QUERYparse_url一对一parse_url_tuple一对多 常见的行转列包括常见的行转列包括一般的聚合函数比如maxminsum还有汇总函数比如collect_listcollect_set 常见的列转行就是explode函数json_tuple函数只能传入array或者map的数据将它拆分成多行一般会和lateral view一起使用。 select movie, category_name from movie_info lateral view explode(split(category, “,”)) movie_info_tmp as category_name 窗口函数 Rand: rank(): 排序相同的时候排名会重复总数不变dense_rank():排序相同的时候排名会重复总数减少row_number():排序相同的时候排名不会重复总数不变 lag(col, n, default)返回往上移n行的数据不存在则返回default lead(col,n, default)返回往下移n行的数据不存在则返回default first_value(col)取分组内排序后第一个值 last_value(col)取分组内排序后最后一个值 over用法首先通过over来指定窗口的特性比如可以传入partition by(分组)order by排序rows between … and … 指定窗口的范围 CURRENT ROW当前行n PRECEDING/FOLLOWING: 往前/后n行数据UNBODUNDED PRECEDING/FOLLOWING表示从前面的起点/到后面的终点默认是rows between UNBOUNDED PRECEDING and current row 10. grouping_sets、cube和rollup 他们都是用于group by后面的一个函数作用是将不同维度的group by进行简化。 grouping_sets(字段1, 字段2)会对字段1和字段2分别分组聚合然后UNION ALLcube字段1字段2会对字段1和字段2的所有组合2的n次方种分别分组聚合然后UNION ALL with cuberolllup 是cube的一个子集rollup会以最左侧的维度为主with rollup 11. 自定义过UDF、UDTF函数吗♥♥♥ 自定义函数 1自定义UDF: 继承UDF重写evaluate方法 2自定义UDTF 继承GernericUDTF重写3个方法:initializeprocessclose 打成jar包上传到服务器中 执行命令add jar “路径”目的是将jar添加到hive中 注册临时函数create temporary function 函数名 as “自定义函数全类名” 12. Hive3的新特性有了解吗 物化视图 简述和普通视图的不同点在于普通视图不保存数据仅仅保存查询语句而物化视图是把查询的结果存入到了磁盘中它的作用是通过预计算保存好一些复杂的计算结果提高查询效率语法 create materialized view … as select … 在向动态分区表中导入数据的时候也可以使用load文件的方式因为底层会自动转换为inser select 语句 13. Hive小文件过多怎么办♥ 首先我说一下为什么会产生小文件呢 hive中产生小文件就是在向表中导入数据的时候通常来说我们在生产环境下一般会使用insertselect的方式导入数据这样会启动MR任务那么reduce有多少个就会输出多少个文件也就是说insert每执行一次啊就至少生产一个文件有些场景下数据同步可能每10分钟就会执行一次这样就会产生大量的小文件。 然后我再说一下问什么要解决小文件呢不解决不行吗 首先对于hdfs来说不适合存储大量的小文件文件多了namenode需要记录元数据就非常大就会占用大量的内存影响hdfs存储性能对于hive来说每个文件会启动一个maptask来处理这样也会浪费计算资源。 最后说一下怎么解决 使用hive自带的concatenate命令合并小文件但是它只支持recfile和orc存储格式MR过程中合并小文件map前: 设置inputformat为combinehiveinputformat在map的时候会把多个文件作为一个切片输入 map后reduce前 map输出的时候合并小文件 hive.merge.mapfiles reduce 后 reduce输出的时候合并小文件hive.merge.mapredfiles 直接设置少一点的reduce数量mapreduce.job.reduces使用hadoop的archive归档方式 14. Hive优化♥♥♥ 建表优化 分区表减少全表扫描通常查询的时候先基于分区过滤再查询 分桶表按照join字段进行分桶join的时候就不会全局join而是桶与桶之间进行join 合适的文件格式公司中默认采用的是ORC的存储格式这样可以降低存储空间内部有两个索引行组索引和布隆过滤器索引的东西可以加快查询速度 我直到的hive的文件格式有textFilesequenceFileORCParque;其中textFile为hive的默认存储格式它和sequenceFile一样都是基于行存储的ORCParquet是基于列存储的。sequenceFileORCParque文件都是以二进制的方式存储的。 合适的压缩格式减少了IO读写和网络传输的数据量比如常用的LZO可切片和snappy 语法优化 单表查询优化 列裁剪和分区裁剪如果select * 或者不指定分区全列扫描和全表扫描效率都很低公司规定了必须指定分区select * 没有明确规定group by优化 开启map端聚合开启负载均衡这样生成的查询计划会有两个MR job一个是局部聚合加随机数另一个是全局聚合删随机数 SQL写成多重模式有多条SQL重复扫描一张表那么我们可以写成from 表 select … select 多表优化查询 CBO优化选择代价最小的执行计划自动优化HQL中多个Join的顺序并选择合适的Join算法 set hive.cbo.enabletrue默认开启 谓词下推将SQL语句中的where谓词逻辑都尽可能提前执行减少下游处理的数据量。 hive.optimize.ppdtrue默认开启 MapJoin:将join双方比较小的表直接分发到各个Map进程的内存中在Map进程中进行join操作这样就不用进行Reduce从而提高了速度 set hive.auto.convert.jointrue默认开启set hive.mapjoin.smalltable.filesize25000000默认25M以下是小表 SMB Join分桶join大表转换为很多小表然后分别进行join最后union到一起 job优化 map优化 复杂文件增加map数小文件合并map端聚合推测执行 reduce优化 合理设置reduce: 为什么不是reduce的数量越多越好 过多的启动和初始化reduce也会消耗时间和资源另外有多少个reduce就会有多少个输出文件如果生成的很多个小文件那么如果这些小文件作为下一个任务的输入则也会出现小文件过多的问题 推测执行 任务整体优化 fetch抓取Hive中对某些情况的查询可以不必使用MapReduce计算【全局查找、字段查找、limit查找】hive.fetch.task.conversionmore小数据集启用本地模式hive.exec.mode.local.autotrue多个阶段并行执行 set hive.exec.paralleltrueJVM重用针对小文件过多的时候使用 15. 常用函数的补充 NVL(value, default)如果value为null就返回default否则返回valueIF(expr, value1, value2)如果expr为true返回value1,否则返回value2concat_WS(seperator, str1, str2, …)参数可以是字符串也可以是数组substring(value, start, len)字符串索引是从1开始我们要截取value中第start字符开始len长度的字符串日期函数: 行列转换
http://www.zqtcl.cn/news/323349/

相关文章:

  • 河南造价信息网官网为什么要做网站优化
  • 网站做个seo要多少钱做公司网站开发的公司
  • 企业网站html模板下载安装的字体wordpress
  • 庙行镇seo推广网站朋友圈的广告推广怎么弄
  • 网站打不开怎么办html怎么做网站背景
  • 厦门网站排名网络服务类型有哪些
  • 如何选择制作网站公司心雨在线高端网站建设专业
  • 山西做网站如何选择2万元最简单装修
  • 广丰区建设局网站友情链接发布网
  • 沧州做网站的专业公司python做网站视频
  • 管理外贸网站模板下载大数据营销优势
  • 做网站的小图标硬盘做网站空间
  • 微信网站界面设计宁波网站优化公司推荐
  • 深圳商城网站开发七冶建设集团网站
  • 广州旅游网站建设设计公司wordpress长文章分页代码
  • 手机营销网站网站的字体
  • 设计网站大全软件互动营销用在哪些推广上面
  • 建设银行网站怎样查询贷款信息吗台州网站制作 外贸
  • 建设网站的步骤知乎app开发定制公司
  • 怎样自己做刷赞网站专业网站设计服务
  • 云主机建站如何让自己做的博客网站上线
  • 目前我们的网站正在建设中做网站违反广告法
  • 有没有做美食的规模网站怎么做国外的网站吗
  • 竭诚网络网站建设开发杭州百度推广
  • 怎样购买起名软件自己做网站小程序制作收费
  • 制作企业网站欢迎界面素材cuntlove wordpress
  • 适合建设网站的国外服务器人工智能培训机构
  • 怎么套网站潜江资讯网招聘信息
  • 网站建设 微信公众号建设网站需要
  • 做房产经纪的那些网站可以进客网站关键词排名如何做