首页
留言页面
归档
友情链接
Search
1
navicat和idea的那啥方法
221 阅读
2
开始了新征途,出发
124 阅读
3
关于操蛋的四月的一些碎碎念
117 阅读
4
面试题 — 连续登录问题的简单记录
61 阅读
5
重建站的碎碎念
55 阅读
默认分类
linux
leetcode
hive
数据结构
登录
/
注册
Search
标签搜索
hive
情感
生活随感
海绵
累计撰写
29
篇文章
累计收到
6
条评论
今日撰写
0
篇文章
首页
栏目
默认分类
linux
leetcode
hive
数据结构
页面
留言页面
归档
友情链接
用户登录
登录
注册
搜索到
11
篇与
hive
的结果
2022-04-14
SQL中的 join 操作
SQL中的 join 操作题目如下A表目前有100万数据,B表10条数据,根据关联键匹配 A 表中的数据与 B 表中的数据管关联关系一一对应,A表中能关联上48万数据。B表中能关联上的数据为5条。那么问:A inner join B、A left join B、A right join B、A full join B 的连接方式,最终查询出的数据量分别是多少。答案:A inner join B ——》 48万A left join B ——》 100万A right join B ——》 48万 + 5A full join B ——》 100万 + 5稍微解析一下。inner join 是返回两者的公共部分。因为是 A 表做基准。A中能关联上 48 万 条。所以答案是 48 万。第二个是 返回左边能关联上的,加没有关联上的。100 万。倘若 B 中存在重复的,条数就不是 100 万了,得看具体的情况了。第三个是 返回右表关联上的,加上没关联上的。A表中能关联上48万数据。B表中能关联上的数据为5条。这里可以理解上 A 表中的 48 万条数据关联 右表的五条数据。这里就是 48 万 + 5 条 。第四个是 完全 join 的,具体可以看图。100 万 + 5 条。可以理解成 A 表的全部 然后加上 B 表没有关联上的数据。上图是各种的 join 操作的示意图。以左表为基准,去扫描另外一个表的全部函数,一行行去匹配。
2022年04月14日
11 阅读
0 评论
0 点赞
2022-04-14
HIVE 中的 count 记录
HIVE 中的 count 记录count(*) 和 count(1) 都是对表中的数据进行统计计算,其中包括空值。这两个貌不走 mr 过程。count(字段)也是对该表进行统计,但是会排除 null 值。空字符串也会计算的。这个会有 mr 过程。还有一点区别就是:在 内部表的时候 没走 mr 的流程,直接从元数据中获取了。这里配置了 mysql 存元数据,所以直接去mysql中获取了。这里假如分10次写入了100条文件,然后hdfs上会产生10个文件的,这时候如果手动删除的话,在做 count 的操作就会出错。但是如果是外部表的话,都会走 mr 的过程的。只要走了 mr 的过程,就不会发生错误。
2022年04月14日
3 阅读
0 评论
0 点赞
2022-04-14
hive 调优
hive 企业级调优Hive的优化主要分为:配置优化、SQL语句优化、任务优化等方案。其中在开发过程中主要涉及到的可能是SQL优化这块。优化的核心思想是:减少数据量(例如分区、列剪裁)避免数据倾斜(例如加参数、Key打散)避免全表扫描(例如on添加加上分区等)减少job数(例如相同的on条件的join放在一起作为一个任务)采用 spark 之类的查询引擎查看执行计划explain select * from studyfetch抓取Fetch 抓取是指,Hive 中对某些情况的查询可以不必使用 MapReduce 计算。在 hive-default.xml.template 文件中 hive.fetch.task.conversion 默认是 more,老版本 hive 默认是 minimal,该属性修改为 more 以后,在全局查找、字段查找、limit 查找等都不走 mapreduce。配置优化这一部分主要是开启 hive 的配置,从而达到优化的效果。例如 开启CBO优化,开启在 map 端的优化,调整在 map 端聚合操作的条数,在有数据倾斜的时候开始负载均衡(这个配置默认是 false 的),打开谓词下推,设置自动选择 map join 。设置任务并行执行。开启严格模式。表的优化小表和大表 join将 key 相对分散,并且数据量小的表放在 join 的左边,可以使用 map join 让小的维度表 先进内存。在 map 端完成 join。 实际测试发现:新版的 hive 已经对小表 JOIN 大表和大表 JOIN 小表进行了优化。小表放 在左边和右边已经没有区别。空 KEY 过滤如果是 inner join 的话,会过滤空值。但是其他的 join 可就不会了。所以的过滤空值。不然容易造成数据倾斜.count(distinct id)由于 COUNT DISTINCT 操作需要用一个 Reduce Task 来完成,这一个 Reduce 需要处理的数据量太大,就会导致整个 Job 很难完成。优化办法:采用 group by 去重,然后在 count() 起来select count(id) from (select id from bigtable group by id) a;行列过滤列处理:在 select 中,只拿需要的列,不要使用 select * ,存在分区就使用分区限制条件。行处理:在使用外关联的时候,如果将副表的过滤条件写在 where 条件之后,那么就会先全表关联,之后在过滤。优化方案要根据场景去判断,可以先用子查询减少数据量,然后在做关联的操作。谓词下推简而言之,就是在不影响结果的情况下,尽量将过滤条件提前执行。谓词下推后,过滤条件在map端执行,减少了map端的输出,降低了数据在集群上传输的量,节约了集群的资源,也提升了任务的性能。Hive中的Predicate Pushdown Rules(谓词下推规则)_strongyoung88的博客-CSDN博客_hive谓词下推谓词下推也会有失效的效果。可以看下表。建议先子查询,减少数据量在关联表。笛卡尔积join操作不加on条件的时候,或者on的条件无效,hive只能使用一个 reduce 去完成任务,设置严格模式,不允许出现笛卡尔积。
2022年04月14日
6 阅读
0 评论
0 点赞
2022-04-14
hive数据倾斜
hive数据倾斜什么是倾斜数据倾斜是 “一个人累死,其他人闲死” 的情况。产生现象任务长时间维持在99%,无法完成任务。或者任务运行的时间远远超过平均时间。判断的方法可以通过以下的方法去操作。通过时间去判断,通过counter判断。产生的原因对于join过程来说,如果出项较多的key值为空或异常的记录,或key值分布不均匀,就容易出现数据倾斜。对于group by 过程来说,如果某一个key值有特别的多的记录,其它key值的记录比较少,也容易出项数据倾斜。业务场景空值产生的数据倾斜对于这种,要么不参与关联,要么赋特殊值。不同数据类型关联产生数据倾斜这个好像没啥用,毕竟可以转换了。但是都是字符类型的比较的话,是按照一位一位比较的。好比如 3>123实现过程优化办法增加reduce个数配置reduce个数,但是不要配置过多,不然会导致输出小文件过多。set mapred.reduce.tasks = 15;开启 map joinmap join 原理:使用Map Join将小表装入内存,在map端完成join操作,这样就避免了shuffle,reduce操作。省去了 shuffle 阶段。shuffle过程代价非常昂贵,因为他需要排序以及合并。在大表和小表的join操作时,可以开启 map join。不过这个配置在新版本中默认开启了。可以调整小表的大小。set hive.auto.convert.join = true; 是否开启自动mapjoin,默认是true set hive.mapjoin.smalltable.filesize=100000000; mapjoin的表size大小map join 是把小表分发到每一个map上,然后在把全部表读入读入内存之中。调整内存调大内存,防止内存溢出。严格模式开启严格模式,防止发生笛卡尔积。参数调优跟上面这个方法类似,都是属于参数上的调优。set hive.map.aggr=true set hive.groupby.skewindata=true第一个是在map中会做部分聚集操作,效率更高但需要更多的内存。第二个是数据倾斜时负载均衡,当选项设定为true,生成的查询计划会有两个MR Job。第一个MR Job 中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MR Job再根据预处理的数据结果按照Group By Key分布到Reduce中(这个过程可以保证相同的Group By Key被分布到同一个Reduce中),最后完成最终的聚合操作。过滤掉脏数据如果大 key 是无意义的脏数据,直接过滤掉。大key单独处理把大的key单独拿出来单独处理。减少参与关联的数据。好比如订单场景,某一天在北京上海中做了强力推广,但是其他城市的订单量并没有变化,然后在统计订单情况的时候,做了 group 操作,数据倾斜就发生了。count(distinct)的优化count distinct 的操作只有一个 reduce,也容易发生数据倾斜的操作。优化的办法:先进行一个 group 分组,分组了之后在执行 count 的操作。给key值加随机数在map阶段时给key加上一个随机数,有了随机数的key就不会被大量的分配到同一节点(小几率),待到reduce后再把随机数去掉即可。翻译成sql的话就是两次group by,第一次 key 加随机数,第二次使用key。
2022年04月14日
8 阅读
0 评论
0 点赞
2022-04-14
hive数据库和表
DDL扫盲DML(data manipulation language)数据库操作语言: 它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言DDL(data definition language)数据库定义语言: DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用DCL(Data Control Language)数据库控制语言: 是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL 数据库创建数据库这里要养成一个习惯,加上 if not existscreate database if not exists xx;指定数据库文件路径在hive中可以指定路径的。create database if not exists xx location 'xxx/xxx';列举数据库查看全部数据库,同时可以后面加上 like 进行过滤的操作。show databases;查看数据库及进阶版desc database xxx; # 进阶版就是加上 extended 查看更多。给数据库加备注用户可以使用 ALTER DATABASE 命令为某个数据库的 DBPROPERTIES 设置键-值对属性值, 来描述这个数据库的属性信息。alter database db_hive set dbproperties('createtime'='20170830');删除数据库drop database db_hive2;强制删除数据库因为数据库中存在表,所以需要强制删除。drop database db_hive cascade;表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] [TBLPROPERTIES (property_name=property_value, ...)] [AS select_statement]EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时可以指定一个指向实 际数据的路径(LOCATION),在删除表的时候,内部表的元数据和数据会被一起删除,而外 部表只删除元数据,不删除数据。内部表和外部表的相互转换注意:('EXTERNAL'='TRUE')和('EXTERNAL'='FALSE')为固定写法,区分大小写!alter table student2 set tblproperties('EXTERNAL'='FALSE');重命名表数据库的名字不支持修改,但是表支持重命名。alter table xxx rename to new_xxx表中修改列名修改列名的时候记得加上类型。alter table student change id student_id string;表中增加一列columns 这一个必不可少。alter table student add columns (id string);导入数据导入数据一共有五种方式。直接 load把查询的数据插入到表中创建表后直接加载数据创建表时通过 Location 指定加载数据路径Import 数据到指定 Hive 表中但是这里直演示前面三种操作。load数据 load data [local] inpath '数据的 path' [overwrite] into table student [partition (partcol1=val1,…)];其中 local 是本地路径,不是 hdfs 的。overwrite 是表示追加。后面是指定分区。查了数据在插入表注意指定分区的操作,partition 加括号 insert overwrite table student_par partition(month='201707') select id, name from student where month='201709';创建表后插数据这里的 as 在创建表的参数里面出现过。create table if not exists student3 as select id, name from student;导出数据这里就没必要整的花里胡哨了。直接使用 hive shell 模式就好了。hive -e 'xxxx' > xxx.txt查询语句
2022年04月14日
7 阅读
0 评论
0 点赞
1
2
3