hive学习之路

#变量

#引入变量
given_dayno="‘20190601‘"
……
dayno=${given_dayno}
#退出
exit ${v_job_stat}

#参数

#map过大 跑不动number of mappers: 230691; number of reducers: 1099
set mapred.max.split.size=1000000000;
#并行执行(union all 多的情况)
set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=8;
#跟大家分享个hive调优的方法
今天有个任务,数据量不大(几个字段),但是记录数3kw左右,做join有个stage跑了一个多小时都没跑完
--时间长原因
map数太少,运行时该stage被只分配了11个map
--解决方法:适当加大map
set mapreduce.input.fileinputformat.split.maxsize=20000000;
set mapreduce.input.fileinputformat.split.minsize.per.node=10000000;
set mapreduce.input.fileinputformat.split.minsize.per.rack=10000000;
优化后,脚本大概20分钟就跑完了
#常见的设置参数
set hive.merge.mapredfiles=true;
set hive.merge.mapfiles=true;
set hive.merge.smallfiles.avgsize=536870912;
set mapred.max.split.size=134217728;
set mapreduce.map.memory.mb=4096;
set mapreduce.reduce.memory.mb=6144;
set hive.auto.convert.join=true;
set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=8;
set hive.exec.compress.intermediate=true;
set hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
set hive.exec.reducers.bytes.per.reducer=134217728;

#hql

#count(0)也算一条记录
错:count(if(act_code in (‘20090031‘,‘20180031‘,‘20090080‘),1,0))
对:count(if(act_code in (‘20090031‘,‘20180031‘,‘20090080‘),1,null))
    sum(if(act_code in (‘20090031‘,‘20180031‘,‘20090080‘),1,0))
#增加列
alter table table_name add columns (col_name bigint);
#修改名
ALTER TABLE name RENAME TO new_name
ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...])
ALTER TABLE name DROP [COLUMN] column_name
ALTER TABLE name CHANGE column_name new_name new_type
ALTER TABLE name REPLACE COLUMNS (col_spec[, col_spec ...])
#根据分区字段删除分区:
ALTER TABLE my_partition_test_table DROP IF EXISTS PARTITION (p_loctype=‘MHA‘);
#substring,注意,从1开始,不是0;
#截取 从字符串的第 4 个字符位置开始取,只取 2 个字符。
select substring(‘example.com‘, 4, 2);
#substring 取最后两位
select substring(‘abc‘,length(‘abc‘)-1,2)
#建表
CREATE TABLE tableName
(
     col1       string,
     col2       bigint
)
partitioned by (dayno string)
row format delimited
fields terminated by ‘\t‘
COLLECTION ITEMS TERMINATED BY ‘,‘
MAP KEYS TERMINATED BY ‘:‘
stored as orcfile; 
#分享一个自己遇到的MAPJOIN代码运行效率调优的实例:调优前运行5小时,
MAPJOIN调优后运行1小时左右,大表小表join时使用MAPJOIN能有效提升运行效率。
优化后代码截取段:
    select /*+ MAPJOIN(t2,t3) */
               t1.imei,t1.gender,t1.age,t1.city_grade_name,t1.model,t3.series
        from dw.f_agt_user_tag t1
        inner join
        (
            select max(dayno) as dayno
            from dw.f_agt_user_tag
        ) t2 on t1.dayno = t2.dayno
        inner join
        (
            select model_level_1 as model,series
            from dw.f_dim_model_info
            group by model_level_1,series
        ) t3 on t1.model=t3.model
        where t1.imei is not null
        group by t1.imei,t1.gender,t1.age,t1.city_grade_name,t1.model,t3.series

参考阅读资料:
https://blog.csdn.net/kwu_ganymede/article/details/51365002
https://blog.csdn.net/liuxiao723846/article/details/78739097
https://help.aliyun.com/knowledge_detail/40270.html
#PARTITION BY      order by
计算累计
SELECT cookieid,
createtime,
pv,
SUM(pv) OVER(PARTITION BY cookieid ORDER BY createtime) AS pv1, -- 默认为从起点到当前行
SUM(pv) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS pv2, --从起点到当前行,结果同pv1
SUM(pv) OVER(PARTITION BY cookieid) AS pv3,                                --分组内所有行
SUM(pv) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS pv4,   --当前行+往前3行
SUM(pv) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING) AS pv5,    --当前行+往前3行+往后1行
SUM(pv) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS pv6   ---当前行+往后所有行
FROM lxw1234;

cookieid createtime     pv      pv1     pv2     pv3     pv4     pv5      pv6
-----------------------------------------------------------------------------
cookie1  2015-04-10      1       1       1       26      1       6       26
cookie1  2015-04-11      5       6       6       26      6       13      25
cookie1  2015-04-12      7       13      13      26      13      16      20
cookie1  2015-04-13      3       16      16      26      16      18      13
cookie1  2015-04-14      2       18      18      26      17      21      10
cookie1  2015-04-15      4       22      22      26      16      20      8
pv1: 分组内从起点到当前行的pv累积,如,11号的pv1=10号的pv+11号的pv, 12号=10号+11号+12号
pv2: 同pv1
pv3: 分组内(cookie1)所有的pv累加
pv4: 分组内当前行+往前3行,如,11号=10号+11号, 12号=10号+11号+12号, 13号=10号+11号+12号+13号, 14号=11号+12号+13号+14号
pv5: 分组内当前行+往前3行+往后1行,如,14号=11号+12号+13号+14号+15号=5+7+3+2+4=21
pv6: 分组内当前行+往后所有行,如,13号=13号+14号+15号+16号=3+2+4+4=13,14号=14号+15号+16号=2+4+4=10
#索引失效
看看有没有索引,没有建,有,看是否失效;
比如dim int ,查询可以写成dim=1,或者dim=‘1‘,但是dim=‘1‘就会索引失效
#rlike(一列中包含另一列,如标题,包含低俗词)
a.title rlike b.word
#笛卡尔积
cross join(匹配一个表,如含低俗词)
#开窗函数 分析函数
OVER(PARTITION BY)函数用法
分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行。
1:over后的写法:
   over(order by salary)    按照salary排序进行累计,order by是个默认的开窗函数
   over(partition by deptno)按照部门分区
2、开窗的窗口范围:
   over(order by salary range between 5 preceding and 5 following):窗口范围为当前行数据幅度减5加5后的范围内的。
3、与over函数结合的几个函数介绍
   a)rank()over() 、dense_rank()over()可以把并列第一查出来,row_number()over()只返回一个结果
   b)rank()是跳跃排序,有两个第二名时接下来就是第四名;dense_rank()是连续排序,有两个第二名时仍然跟着第三名
   select * from
    (
    select name,class,s,rank()over(partition by class order by s desc) mm from t2
    )
    where mm=1;

   c)sum()over()
   d)first_value() over()和last_value() over()
#concat_ws  用|串联 
concat_ws(‘|‘,collect_set(host)) as host
#筛选条件
select * from t1 left outer join t2 on t1.id=t2.id and t2.cnt>=40  表2先筛选大于等于40,再关联
select * from t1 left outer join t2 on t1.id=t2.id where t2.cnt>=40  最后筛选,如果有空,也会过滤掉
#多层聚类cube
SELECT  month, day,
COUNT(DISTINCT cookieid) AS uv,
GROUPING__ID
FROM cookie5
GROUP BY month,day
WITH CUBE
ORDER BY GROUPING__ID;

等价于

SELECT NULL,NULL,COUNT(DISTINCT cookieid) AS uv,0 AS GROUPING__ID FROM cookie5
UNION ALL
SELECT month,NULL,COUNT(DISTINCT cookieid) AS uv,1 AS GROUPING__ID FROM cookie5 GROUP BY month
UNION ALL
SELECT NULL,day,COUNT(DISTINCT cookieid) AS uv,2 AS GROUPING__ID FROM cookie5 GROUP BY day
UNION ALL
SELECT month,day,COUNT(DISTINCT cookieid) AS uv,3 AS GROUPING__ID FROM cookie5 GROUP BY month,day

参考:https://www.cnblogs.com/qingyunzong/p/8798987.html
#UNION ALL
可以将2个或多个表进行合并。每一个union子查询都必需具有相同的列,而且对应的每个字段的字段类型必须是一致的。
UNION ALL允许值重复;如果不允许重复值出现,则只需要UNION。
#cast类型转换
cast(dayno as string)

BINARY类型只支持将BINARY类型转换为STRING类型;如果用户知道其值是数值的话,可以通过嵌套cast()的方式对其进行分类转换。
#ORDER BY和SORT BY
ORDER BY:对查询结果集执行一个全局排序。
SORT BY:只会在每个reducer中对数据进行排序,即执行一个局部排序过程。
- ASC(默认值,升序);DESC(降序)
含有SORT BY的DISTRIBUTE BY
#JOIN

#INNER JOIN:只有进行连接的两个表中都存在与连接标准相匹配的数据才会被保留下来;
#OUTER JOIN
#LEFT OUTER JOIN:JOIN操作符左边的表符合WHERE子句的所有记录将会被返回,JOIN操作符右边表中如果没有符合ON后面连接条件的记录时,那么从右边表指定选择的列将会是NULL。
#RIGHT OUTER JOIN:返回右边表所有符合WHERE语句的记录,左表中匹配不上的字段值用NULL代替。
#FULL OUTER JOIN:返回所有表中符合WHERE语句条件的所有记录;如果任一表的指定字段没有符合条件的值的话,那就使用NULL值代替。
#LIMIT
用于限制返回的行数
#CASE ... WHEN ... THEN句式:与if条件语句相似,用于处理单个列的查询结果
case
           when substring(imei,length(imei)-1,2) between ‘00‘ and ‘09‘ then ‘00-09‘
           when substring(imei,length(imei)-1,2) between ‘10‘ and ‘19‘ then ‘10-19‘
           when substring(imei,length(imei)-1,2) between ‘20‘ and ‘29‘ then ‘20-29‘
           when substring(imei,length(imei)-1,2) between ‘30‘ and ‘39‘ then ‘30-39‘
           when substring(imei,length(imei)-1,2) between ‘40‘ and ‘49‘ then ‘40-49‘
           when substring(imei,length(imei)-1,2) between ‘50‘ and ‘59‘ then ‘50-59‘
           when substring(imei,length(imei)-1,2) between ‘60‘ and ‘69‘ then ‘60-69‘
           when substring(imei,length(imei)-1,2) between ‘70‘ and ‘79‘ then ‘70-79‘
           when substring(imei,length(imei)-1,2) between ‘80‘ and ‘89‘ then ‘80-89‘
           when substring(imei,length(imei)-1,2) between ‘90‘ and ‘99‘ then ‘90-99‘
        end as imei
       ,sum(1)
#INSERT OVERWRITE/INTO

insert overwrite table t partition (dt=${YYYYMMDD})
#装载数据
LOAD DATA LOCAL INPATH 路径

hql="
load data inpath ‘/tmp/erciyuan‘ overwrite into table dc_tmp.temp_20190612_magazine_download

;"

原文地址:https://www.cnblogs.com/syj-love-dy/p/11130194.html

时间: 2024-11-05 21:39:27

hive学习之路的相关文章

Hive学习之路 (一)Hive初识

Hive 简介 什么是Hive 1.Hive 由 Facebook 实现并开源 2.是基于 Hadoop 的一个数据仓库工具 3.可以将结构化的数据映射为一张数据库表 4.并提供 HQL(Hive SQL)查询功能 5.底层数据是存储在 HDFS 上 6.Hive的本质是将 SQL 语句转换为 MapReduce 任务运行 7.使不熟悉 MapReduce 的用户很方便地利用 HQL 处理和计算 HDFS 上的结构化的数据,适用于离线的批量数据计算. 数据仓库之父比尔·恩门(Bill Inmon

Hive学习之路(一)Hive初识

Hive简介 什么是Hive Hive由Facebook实现并开源 是基于Hadoop的一个数据仓库工具 可以将结构化的数据映射为一张数据库表 提供HQL(Hive SQL)查询功能 底层数据是存储在HDFS上 Hive的本质是将SQL语句转换为MapReduce任务运行 使不熟悉MapReduce的用户很方便地利用HQL处理和计算HDFS上的结构化数据,适用于离线的批量数据计算 为什么使用Hive ? 直接使用MapReduce所面临的问题: 人员学习成本太高 项目周期要求太短 MapRedu

[转帖]Hive学习之路 (一)Hive初识

https://www.cnblogs.com/qingyunzong/p/8707885.html 讨论QQ:1586558083 目录 Hive 简介 什么是Hive 为什么使用 Hive Hive 特点 Hive 和 RDBMS 的对比 Hive的架构 1.用户接口: shell/CLI, jdbc/odbc, webui Command Line Interface 2.跨语言服务 : thrift server 提供了一种能力,让用户可以使用多种不同的语言来操纵hive 3.底层的Dr

Hive学习之路 (二)Hive安装

Hive的下载 下载地址http://mirrors.hust.edu.cn/apache/ 选择合适的Hive版本进行下载,进到stable-2文件夹可以看到稳定的2.x的版本是2.3.3 Hive的安装 1.本人使用MySQL做为Hive的元数据库,所以先安装MySQL. MySql安装过程http://www.cnblogs.com/qingyunzong/p/8294876.html 2.上传Hive安装包 3.解压安装包 [[email protected] ~]$ tar -zxvf

Hive学习之路 (三)Hive元数据信息对应MySQL数据库表

概述 Hive 的元数据信息通常存储在关系型数据库中,常用MySQL数据库作为元数据库管理.上一篇hive的安装也是将元数据信息存放在MySQL数据库中. Hive的元数据信息在MySQL数据中有57张表 一.存储Hive版本的元数据表(VERSION) VERSION   -- 查询版本信息 该表比较简单,但很重要. VER_ID SCHEMA_VERSION VERSION_COMMENT ID主键 Hive版本 版本说明 1 0.13.0 Set by MetaStore 如果该表出现问题

Hive学习之路 (五)DbVisualizer配置连接hive

一.安装DbVisualizer 下载地址http://www.dbvis.com/ 也可以从网上下载破解版程序,此处使用的版本是DbVisualizer 9.1.1 具体的安装步骤可以百度,或是修改安装目录之后默认安装就可以 二.配置DbVisualizer里的hive jdbc 1.在DbVisualizer的安装目录jdbc文件夹下新建hive文件夹 D:\Program Files\DbVisualizer\jdbc 2.拷贝Hadoop的相关jar包放入新建的hive文件夹里面 jar

Hive学习之路 (六)Hive的DDL操作

库操作 1.创建库 语法结构 CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name [COMMENT database_comment] //关于数据块的描述 [LOCATION hdfs_path] //指定数据库在HDFS上的存储位置 [WITH DBPROPERTIES (property_name=property_value, ...)]; //指定数据块属性 默认地址:/user/hive/warehouse/db_name.d

Hive学习之路 (七)Hive中文乱码

Hive注释中文乱码 创建表的时候,comment说明字段包含中文,表成功创建成功之后,中文说明显示乱码 create external table movie( userID int comment '用户ID', movieID int comment '电影ID', rating int comment '电影评分', timestamped bigint comment '评分时间戳', movieName string comment '电影名字', movieType string

Hive学习之路 (六)Hive SQL之数据类型和存储格式

一.数据类型 1.基本数据类型 Hive 支持关系型数据中大多数基本数据类型 类型 描述 示例 boolean true/false TRUE tinyint 1字节的有符号整数 -128~127 1Y smallint 2个字节的有符号整数,-32768~32767 1S int 4个字节的带符号整数 1 bigint 8字节带符号整数 1L float 4字节单精度浮点数 1.0 double 8字节双精度浮点数 1.0 deicimal 任意精度的带符号小数 1.0 String 字符串,

Hive学习之路 (十)Hive的高级操作

一.负责数据类型 1.array 现有数据如下: 1 huangbo guangzhou,xianggang,shenzhen a1:30,a2:20,a3:100 beijing,112233,13522334455,5002 xuzheng xianggang b2:50,b3:40 tianjin,223344,13644556677,6003 wangbaoqiang beijing,zhejinag c1:200 chongqinjg,334455,15622334455,20 建表语