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

安庆网络推广公司深圳网站优化平台

安庆网络推广公司,深圳网站优化平台,3d全屋定制设计软件,asp.net网站开发教程从MySQL快速上手大数据Hive Hive简介 ​ hive是基于Hadoop构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式(DML)来分析存储在Hadoop分布式文件系统中的数据: 可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查…

从MySQL快速上手大数据Hive

Hive简介

​ hive是基于Hadoop构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式(DML)来分析存储在Hadoop分布式文件系统中的数据: 可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能;可以将SQL语句转换为MapReduce任务运行,通过自己的SQL查询分析需要的内容,这套SQL简称Hive SQL,使不熟悉mapreduce的用户可以很方便地利用SQL语言查询、汇总和分析数据。
​ hive不适合用于联机(online)事务处理,也不提供实时查询功能。
它最适合应用在基于大量不可变数据的批处理作业。

​ 下图展示了大数据中数据查询的整个过程
在这里插入图片描述

MapReduce原理

Map就是映射,负责数据过滤分割,将原始数据转化为键值对;Reduce是合并,将具有相同key值的value进行处理后再输出新的键值对,最后存储到HDFS。为了让Reduce可以并行处理Map的结果,必须对Map的输出进行一定的排序与分割,然后再交给对应的Reduce,而这个将Map输出进行进一步整理并交给Reduce的过程就是Shuffle。整个MR的大致过程如下:

在这里插入图片描述

Hive使用

Hive表类型

内表:建表时不需要指定location。删除内表时,对应的HDFS文件一并删除。非分区表所有文件放在表location下,非压缩表。

外表:外表用EXTERNAL关键字来创建。外表需要指定location。删除外表时,不删除对应的HDFS文件。数据以ORC文件存储,用SNAPPY算法压缩

在这里插入图片描述

在这里插入图片描述

Hive常见数据类型

与Mysql基本保持一致。
在这里插入图片描述

使用CAST函数进行类型转换。

# sku_id是varchar 
# 但需要转成INT为了方便后面做数值运算 
# 此时就需要使用到CAST函数
SELECT CAST(sku id AS INT) FROM sku sale list

Hive常用函数

主要跟Mysql中常用函数一致
在这里插入图片描述

SYSDATE()函数是自研函数,用法如下

sysdate() 
# 获取当天数据
SELECT sysdate() 
-- 结果:2025-03-02# 获取昨天数据
SELECT sysdate(-1) 
-- 结果:2025-03-01# 获取明天数据
SELECT sysdate(1) 
-- 结果:2025-03-03

其他函数举例如下,都跟Mysql中用法一致

round()
SELECT round(6.28); -- 结果:6
SELECT round(6.58); -- 结果:7
SELECT round(6.58410834,2); -- 结果:6.58
SELECT round(6.58470834,3); -- 结果:6.585
SELECT round(6.5,3); -- 结果:6.500
substr() 字符串截取
SELECT substr('字符串'从哪开始截[,截几个])
SELECT substr('abcdefghijk',3); --结果:cdefghijk
SELECT substr('abcdefghijk',3,2); -- 结果:cd
SELECT substr('abcdefghijk',-3); -- 结果:ijk
SELECT substr('abcdefghijk',-3,2); --结果:ij
split() 字符串切割
SELECTsplit('中国,美国,英国,法国',',') name #以,来切割'中国,美国,英国,法国'字符串
FROM test3;
-- 结果:[中国"'美国’'英国''法国']SELECTsplit('中国,美国,英国,法国'',')[0]name
FROM test3;
-- 结果:中国SELECTsplit('中国,美国,英国,法国…')[1] name
FROM test3;
-- 结果:美国
concat() 字符串拼接
SELECT concat("123","aaa");	-- 结果:123aaa
SELECT concat("123""aaa"'张三'); --结果:123aaa张三
collect set()/collect_... 行转列 列转行
name
tom
marry
peter
tom
tom
marry
SELECT collect_set(name) FROM test2;
-- 结果:["tom","marry","peter"]SELECT collect_list(name) FROM test2;
-- 结果:["tom","marry","peter","tom","tom","marry"]

HiveDML操作

Hive提供了类SQL的数据操作语言DML,用于操作数据表中的数据,例如数据的加载、查询和插入等操作。

插入数据 语法如下:
INSERT INTO table name [PARTITION(partition column = partition value)]
VALUES(value1,value2,...);--示例:直接插入固定数据:
INSERT INTO employees VALUES(1001'John Doe'!5000);--示例:插入查询结果数据:
INSERT INTO table_name [PARTITION(partition_column = partition_value)]
SELECT column_list FROM source_table WHERE condition;
更新数据在默认情况下,Hive不支持使用UPDATE更新操作。可以用以下方式。--示例1:将original_table表中数据更新
CREATE TABLE temp_table AS SELECT * FROM original_table;DROP TABLE original_table;
ALTER TABLE temp_table RENAME To original_table;--示例2:
INSERT OVERWFITE TABLE temp_table SELECT * FROM original_table;
删除数据
Hive不支持使用DELETE语句来删除数据,如果您希望删除整个分区及其所有数据,可以使用 ALTER TABLE 命令
--示例: 删除分区数据
ALTER TABLE employees DROP PARTITION(department='IT');--示例:删除整表数据
DROP TABLE employees;
查询数据 与MySQL中一致
-- 检索所有列
SELECT * FROM employees;-- 检索特定列
SELECT erp,salary,age FROM employees;-- 检索薪资大于5000的员工
SELECT erp,salary,age FROM employees WHERE salary > 5000-- 汇总薪资大于5000的员工的总薪资
SELECT SUM(salary) FROM employees WHERE salary > 5000;
关联查询数据 与MySQL中一致
-- 内连接:返回两表id能匹配上的记录
SELECT t1.name,t2.cityFROM employees t1JOIN city t2ON t1.id = t2.id-- 左连接:返回左表全量数据
SELECT t1.name,t2.cityFROM employees t1LEFT JOIN city t2ON t1.id=t2.id-- 右连接:返回右表全量数据
SELECT t1.name,t2.cityFROM employees t1RIGHT JOIN city t2ON t1.id=t2.id-- 全连接:返回左表和右表全量数据
SELECT t1.namet2.cityFROM employees t1FULL JOIN city t2ON t1.id =t2.id

Hive优化和案例讲解

核心优化思想

  • 尽早过滤不需要的数据,减少每个阶段输出数据量
  • 减少 job 数量
  • 尽量让map阶段均衡读取数据,减少数据倾斜

过滤不需要数据

----列裁剪(尽量避免使用*)
table1:a、b、c、d、e、f
table2:a、g、h、i、k
SELECT t1.a,t1.b,t1.c,t2.gFROM ( SELECT a,b,c FROM table1 WHEREe < 40 ) t1JOIN ( SELECT a,g FROM table2 WHERE k = '北京' ) t2ON t1.a = t2.a----分区裁剪
--在查询的过程中 分区越精确越好
oper_erp		oper_type		dt				ht
zhangsan		create_file		2024-08-01		02
lisi			delete file		2024-08-01		03
wangwu			create file		2024-08-01		04SELECT erp, path, oper_type,oper_timeFROM system_audit_logWHERE dt = '2024-08-01'AND ht = 03----在join前过滤掉不需要的数据
--先关联,后过滤(不推荐)
SELECT a.val,b.valFROM a
LEFT OUTER JOIN bON a.key = b.keyWHERE a.ds = 2024-08-14 AND b.ds = 2024-08-14
--先过滤,后关联(推荐)
SELECT x.val,y.val FROM(SELECT key,val FROM a WHERE a.ds=2024-08-14) x
LEFT OUTER JOIN(SELECT key,val FROM b WHERE b.ds=2024-08-14) y 
ON x.key=y.key

减少job数

-- 多表关联时尽量选择同一个key:无论内关联还是外关联,如果join的key相同的话,不管关联多少个表只生成一个job。下面以a,b,c 三表举例--- 被翻译成 1 个 JOB
SELECT a.val, b.val, c.valFROM aJOIN b ON (a.key = b.key1)JOIN c ON (b.key1 = c.key)--- 被翻译成 2 个 JOB
SELECT a.val, b.val, c.valFROM aJOIN b ON (a.key = b.key1)JOIN c ON (b.key2 = c.key)--- union all 中的 job 优化
-- 2个job
SELECT * FROM
(select c1, c2 from A group by c1, c2) t1
union all
(select c1, c2 from B group by c1, c2) t2-- 1个job
SELECT * FROM
(select c1, c2 from A union all select c1, c2 from B) t
group by c1, c2

查询结果复用

使用 with as 将查询的结果保持下来,供后面的sql使用

-- 查询 a 表两次
INSERT OVERWRITE TABLE tmp1SELECT ... FROM a WHERE 条件1;
INSERT OVERWRITE TABLE tmp2SELECT ... FROM a WHERE 条件1;	-- 查询 a 表一次
WITH AS tmp_a (SELECT ... From a )
INSERT OVERWRITE TABLE tmp1SELECT ... FROM tmp_a WHERE 条件1;
INSERT OVERWRITE TABLE tmp2SELECT ... FROM tmp_a WHERE 条件1;	

行转列

若一行中有一个字段有多个值则给拆除来,单独成几行。

用 explode 关键字来拆分。explode入参是必须是一个列表,故用 split 对all_city关键字进行逗号分割成一个列表

id		user	name	all_citys
id1		user1	name1	北京,天津
id2		user2	name2	上海,河北SELECT id, user, name, city From myTable LATERAL VIEW explode(split(all_city, ',')) adTable AS cityid		user	name	city
id1		user1	name1	北京
id1		user1	name1	天津
id2		user2	name2	上海
id2		user2	name2	河北

去重优化

由于 COUNT DISTINCT 操作需要用一个 Reduce Task 来完成,这一个 Reduce 需要处理的数据量太大,就会导致整个 Job 很难完成。

一般 COUNT DISTINCT 先用 GRUOP BY 再COUNT

对于大数据用GRUOP BY的效率远大于 COUNT DISTINCT

-- 会比较慢 不推荐
SELECT COUNT(DISTINCT id) FROM bigtable;-- 对比大数据集,用GROUP BY的效率明显高于DISTINCT 推荐
SELECT COUNT(id) FROM (SELECT id FROM bigtable GROUP BY id) a;

mapjoin

在查询过程中,将小表放前面,大表放后面

-- mapjoin中小表被作为驱动表直接加载到内存中,每个map都会拿另一个表的数据与内存中的小表数据做匹配,由于每个map处理的数据量大致相同,因此解决了数据倾斜问题-- 启动mapjoin需先设置以下参数
SET hive.auto.convert.join=TRUE
SET hive.mapjoin.smalltable.filesize=25000000; -- 设置小表最大为25MB-- 执行查询语句 /*+ mapjoin(a)*/ 就是将small_table加载进内存
SELECT /*+ mapjoin(a)*/ a.id, b.col FROM small_table aJOIN big_table bON a.id = b.id

减少数据倾斜

数据倾斜指的是 在map-reduce 执行中, 单个map或单个reduce处理的数据量明显大于其他task处理的数据量。比如,空值数据占比大,爆单商品sku数据 就可能会导致数据倾斜。

具体表现:作业经常卡在Reduce=99%处,最后1%要跑很久

#假设有用户表,日志表两张表1 空值数据倾斜处理:赋予空值或其他异常值新的key值
-- 将空值key赋值为一个字符串+随机数,用于把倾斜的数据分布在不同的reducer上
select * from log aleft outer join user bon case when a.user_id is null then concat('hive', rand()) else a.user_id end ) = b.user_id2 key值不均产生的数据倾斜
-- 大量重复key产生的数据倾斜:通过调整参数实现负载均衡
-- 基本思路:先做一次部分聚合,再做最终聚合-- 方法1 map端部分聚合(按大小切片,保证每个map数据量差不多)
set hive.map.aggr = true; -- 默认为true-- 方法2 前面设为true时,生产的查询计划会有两个MR job
set hive.groupby.skewindata = true; -- 默认为false

当然应急的时候,可以对空值,特殊值的过滤来解决数据倾斜。

http://www.dtcms.com/wzjs/71905.html

相关文章:

  • 做淘宝banner的网站做网站建设优化的公司排名
  • 点餐小程序源码下载武汉建站优化厂家
  • 做网站挣钱么钦州seo
  • 将网站发布到微信小程序怎么做网上卖产品怎么推广
  • 如何做代购网站设计windows永久禁止更新
  • 做公益网站的说明山东疫情最新情况
  • 西安网站seo技术厂家自己建网站详细流程
  • 招远做网站公司最火的网络销售平台
  • 廊坊模板网站建设常州百度搜索优化
  • 免费网站建设软件seo优
  • 商务网站建设sz886网络的推广
  • 汉化主题做网站效果图网站注册域名
  • 建设一个购物网站需要什么意思北京网站优化快速排名
  • 青苹果乐园免费观看日本湖南企业seo优化推荐
  • 通化网站开发怎么在百度上发布信息广告
  • 上海突发事件seo关键词排名系统
  • 网站建设 中企动力公司百度的推广广告
  • 如何查找各种网站发布平台有哪些
  • 东莞网站开发云盘网页版登录
  • 88建网站湖人排名最新
  • 广州建网站腾虎上海抖音推广
  • 自己做的网站如何让qq登录电商运营培训正规平台
  • 自助做网站市场推广计划方案
  • wordpress 套餐上海seo招聘
  • 网站名字怎样做版权企业网站的搜索引擎推广与优化
  • 网站备案验证码错误河南seo技术教程
  • 手机网站建设平台合同石家庄头条今日头条新闻
  • 物流网站源代码搜狗推广开户
  • 全屏网站怎么做求职seo推荐
  • 自己的网站做一些诱惑百度指数有哪些功能