首页
留言页面
归档
友情链接
Search
1
navicat和idea的那啥方法
221 阅读
2
开始了新征途,出发
124 阅读
3
关于操蛋的四月的一些碎碎念
117 阅读
4
面试题 — 连续登录问题的简单记录
61 阅读
5
重建站的碎碎念
55 阅读
默认分类
linux
leetcode
hive
数据结构
登录
/
注册
Search
标签搜索
hive
情感
生活随感
海绵
累计撰写
29
篇文章
累计收到
6
条评论
今日撰写
0
篇文章
首页
栏目
默认分类
linux
leetcode
hive
数据结构
页面
留言页面
归档
友情链接
用户登录
登录
注册
搜索到
8
篇与
hive
的结果
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 点赞
2022-04-14
HIve中的函数
函数的分类hive中函数可以分为三类。这里的 一 , 多代表的是函数UDF 一进一出UDAF 多进一出UDTF 一进多出查看函数的描述desc function extended xxx;常用函数nvlNVL( value,default_value)。如果前者是空,则返回后者。case whenCASE WHEN THEN ELSE END AS XX。老熟悉了不介绍了concat拼接字符串concat_ws按照某一个规则拼接字符串。concat_ws(‘-’,’a’,’b’)。其中第一个是分隔符。算是一个特殊的 concat 函数,不推荐使用。而且指定了参数了类型。字符串或者数组。collect_set把数据放到一个set里面,返回一个去重之后的数组。collect_list跟上面一样,但是不会去重。coalesce返回第一个不为null的值,如果都为null,则返回null行转列列转行EXPLODE(col):将 hive 一列中复杂的 Array 或者 Map 结构拆分成多行。但是要求 数组的这个形式,所以要使用 split 这个函数去分割,这个函数分割完了之后返回的是数组的形式。也就符合了 explode 的参数要求了。案例:表 6-7 数据准备 movie category 字段名字《疑犯追踪》 悬疑,动作,科幻,剧情 《Lie to me》 悬疑,警匪,动作,心理,剧情 《战狼 2》 战争,动作,灾难生成的效果《疑犯追踪》 悬疑 《疑犯追踪》 动作 《疑犯追踪》 科幻 《疑犯追踪》 剧情 《Lie to me》 悬疑 《Lie to me》 警匪 《Lie to me》 动作 《Lie to me》 心理 《Lie to me》 剧情 《战狼 2》 战争 《战狼 2》 动作 《战狼 2》 灾难根据上面的分析,我们可以很快的把 category 字段给转成行,但是不能直接 select 出来,因为左边 movie 只有三行,但是右边的数据有 12 行,行数都不一致了,肯定不行的。SELECT movie, category_name FROM movie_info lateral VIEW explode(split(category,",")) movie_info_tmp AS category_name;看需求:是否要跟源表的字段做关联,如果要关联,就需要这个写法了。时间相关函数current_timestampfrom_unixtimefrom_utc_timestampto_unix_timestampto_utc_timestampunix_timestampcurrent_timestamp返回当前时间。格式是时间类型,准确到秒。select current_timestamp; # 2022-03-27 04:10:01.382from_unixtime把时间戳类型的时间转变成时间类型的时间,但是与北京时间缺了8小时。其中它可以指点输出的格式。SELECT from_unixtime(1648323079, 'yyyy-MM-dd HH:mm:ss'); # 2022-03-26 19:31:19from_utc_timestamp上面这个转出来的时间是慢了8小时的,这一个函数就是为了解决这个问题的。参数必须要求是 时间类型的时间,所以需要转一下。后者是指定时区。GMT+8 == PRC 。注意大写select from_utc_timestamp(from_unixtime(1648323079),'GMT+8'); # 2022-03-27 03:31:19to_unix_timestamp把时间转成时间戳的形式,但是这个时间戳也是有8小时时差的问题的。select to_unix_timestamp('2022-03-27 03:31:19'); # 1648351879 ----》 2022-03-27 11:31:19转成时间戳的类型,但是再把这个时间戳转回到时间类型,他就会多8小时了。to_utc_timestamp返回当前正确的北京时间。select to_utc_timestamp(current_timestamp,'RPC'); # 2022-03-27 04:11:18.321unix_timestamp返回时间戳。select unix_timestamp(); # 1648325494 # 提示被抛弃了,使用 current_timestamp 代替时间戳unix_timestamp 和 to_unix_timestamp 都是返回时间戳类型的函数。一个是生成,一个是转成。正常时间除了上面的这两个,其他的都是了。。不想打了时间函数to_date:抽取日期部分select to_date('2020-10-28 12:12:12');year:获取年select year('2020-10-28 12:12:12');month:获取月select month('2020-10-28 12:12:12');day:获取日select day('2020-10-28 12:12:12');hour:获取时select hour('2020-10-28 12:12:12');minute:获取分select minute('2020-10-28 12:12:12');second:获取秒select second('2020-10-28 12:12:12');weekofyear:当前时间是一年中的第几周select weekofyear('2020-10-28 12:12:12');dayofmonth:当前时间是一个月中的第几天select dayofmonth('2020-10-28 12:12:12');months_between: 两个日期间的月份select months_between('2020-04-01','2020-10-28');add_months:日期加减月select add_months('2020-10-28',-3);datediff:两个日期相差的天数select datediff('2020-11-04','2020-10-28');date_add:日期加天数select date_add('2020-10-28',4);date_sub:日期减天数select date_sub('2020-10-28',-4);last_day:日期的当月的最后一天select last_day('2020-02-30');date_format(): 格式化日期select date_format('2020-10-28 12:12:12','yyyy/MM/dd HH:mm:ss');
2022年04月14日
3 阅读
0 评论
0 点赞
1
2