Hive知识点汇总

2023-05-16

HIVE

一、Hive的优化

数据倾斜:shuffle之后Key的分布不均导致分配到Reduce端的数据不均匀,出现个别Reduce的数据过大,执行时间过长而出现的现象。

1、数据倾斜产生的原因:

①数据业务本身的特性,如某作为key值的字段重复较多

②join时,大表与小表关联小表字段作为key值

③join时,大表与大表关联,但是很多数据没关联上,导致产生了空值

④count(distinct) 后导致数据倾斜

⑤group by 时因为分区不合理导致数据倾斜,如group by 的字段某类值过多导致数据倾斜

2、数据倾斜的表现

而当其中每一组的数据量过大时,会出现其他组的计算已经完成而这里还没计算完成,其他节点的一直等待这个节点的任务执行完成,所以会看到一直map 100% reduce 99%的情况,大概率是发生了数据倾斜。

3、hive优化方案

3.1 Fetch抓取

某些情况不需要使用MR进行计算,例如查全表数据,此时可以简单读取表对应的存储目录下的文件,输出到控制台。可以在hive-default.xml.template 文件中 设置hive.fetch.task.conversion ,该属性有三个值[none,minimal,more]可选,默认是more,选择more之后在全局查找、字段查找、limit 查找等都不走 mapreduce。

3.2 本地模式

当输入数据量较小时,可以设置hive.exec.mode.local.auto = true,开启本地MR,开启之后会在本地进行MR计算,而不会使用集群计算,因为小数据量情况下集群的准备时间可能都高于计算时间。同时还因设置 本地模式的最大数据量:hive.exec.mode.local.auto.inputbytes.max,默认是128M,本地模式最大文件数:hive.exec.mode.local.auto.input.files.max,默认是4。

4、数据倾斜优化

①小表、大表join

将key相对分散,数据量较小的表放在join左边

②大表 join 大表

(1)空Key过滤:有时可能因为key为空的数据量过多,空值都到一个Reduce端,导致出现数据倾斜,此时我们可以在join之前将Key为空的数据过滤掉。

(2)空Key转换:有时可能某些Key为空,但对应的数据并不是异常数据,此时不能简单的进行过滤,我们可以通过将空Key进行转换,例如将Key转换成一个字符串加上一个随机数:concat(‘hive’ + rand())。

③MapJoin

当不指定MapJoin或不符合MapJoin的条件时,Hive会在Reduce阶段进行Join操作,容易导致数据倾斜。当进行小表大表join时,我们可以采用MapJoin,通过设置 hive.auto.convert.join = true,hive.mapjoin.smalltable.filesize =25000000(25M);将小表先加载在Map端进行Join操作。以上两个参数为默认值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-24plvVIn-1633663960758)(D:\桌面\hive.assets\image-20210927181300024.png)]

④Group By

如果某个Key的数据特别大,那么在Reduce聚合时就可能导致数据倾斜。解决方案是先进行局部聚合,再进行全局聚合,使用两个MR过程。第一个MR过程为Key加上一个100以内的随机数,然后进行预聚合,并将结果输出到第二个MR作为输入。第二个MR将随机数去除再进行Reduce端的聚合,此时由于前一个MR已经对相同key的数据进行了部分聚合,那么这个Reduce端的数据量就明显减少了,就不容易再发生数据倾斜。并且这个过程也可以使用MapJoin,在Map端也进行一定的聚合。

⑤Count(Distinct)去重统计

当数据量毕竟较大时,count操作中只有一个Reduce,那么这个Reduce就会很难完成任务。此时,可以通过Group By + Count的方式替换count,先进行局部的count,就会有多个Reduce;在进行全局的count。这中方法的缺点是需要多一个Job,但这完全是值得的。

⑥笛卡尔积

尽量避免笛卡尔积,因为Hive只能使用一个Reduce来完成笛卡尔积。

⑦行列过滤

列处理:只拿需要的列,尽量使用分区过滤,少用select *。

行处理:进行join操作时副表的过滤操作如果写在最上层where的后面,则会先进行全表关联,因此我们应该先对副表进行子查询过滤操作,有一定的优化效果。

⑧用作join的字段数据类型要相同

可以减少类型转换消耗的资源

5、MR优化

Job数量:通过explain可以查看stage的数量,会执行的stage的数量就是job的数量。

map数量:map数量有四个影响因素:块的大小,文件大小,文件数量,splitsize大小(切片大小),splitsize=max(minimumsize,min(maximumsize,blocksize));默认blocksize=128M。

reduce数量:在每个MR的main方法中设置,job.setNumReduceTasks()。

①合理设置Map数

小文件太多可以通过合并小文件ConbineHiveInputFormat;

大文件增加Map数,通过computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M 公式,调整maxSize大小小于blocksize就可以增加map数量。

②合理设置Reduce数

默认reduce处理的数据量时256M

③map端处理的小文件过多

要合并小文件,可以通过set hive.merge.mapfiles=true来解决。

⑤map端数据量大,需要扩充map的数量或reduce的数量

set mapred.map.tasks个数,set mapred.reduce.tasks个数

二、HQL底层执行过程

1、HQL执行顺序

首先hql的执行顺序如下

from … where … mapjoin … on … select(筛选有用字段) … group by ||… join … on … select(筛选输出字段) … having … distinct … order by … limit … union/union all

||前是map阶段执行,后的reduce阶段执行

以如下hql为例:

select
  sum(b.order_amount) sum_amount,
  count(a.userkey) count_user
from user_info a
left join user_order b
  on a.idno=b.idno
where a.idno > '112233'
group by a.idno
  having count_user>1
limit 10;

hql执行顺序如下:

Map 阶段

  1. 执行 from,进行表的查找与加载,注意要join的表也要加载进来(MapJoin除外);
  2. 执行 where,注意:sql 语句中 left join 写在 where 之前的,但是实际执行先执行 where 操作,因为 Hive 会对语句进行优化,如果符合谓词下推规则,将进行谓词下推;
  3. 如果join的是小表,可以执行 Map join 操作,按照 key 进行表的关联;
  4. 执行输出列的操作,注意: select 后面只有两个字段(order_amount,userkey),此时 Hive 是否只输出这两个字段呢,当然不是,因为 group by 的是 idno,如果只输出 select 的两个字段,后面 group by 将没有办法对 idno 进行分组,所以此时输出的字段有三个:idno,order_amount,userkey,所以这个select的作用是筛选出需要用到的字段,所以我们在写hql时最好不要用select *;
  5. 执行 map 端的 group by,此时的分组方式采用的是哈希分组,按照 idno 分组,进行
    order_amount 的 sum 操作和 userkey 的 count 操作,最后按照 idno 进行排序(group by 默认会附带排序操作);

Reduce 阶段

  1. 执行 reduce 端的 group by,此时的分组方式采用的是合并分组,对 map 端发来的数据按照 idno 进行分组合并,同时进行聚合操作 sum(order_amount)和 count(userkey);
  2. 执行 select,此时输出的就只有 select 的两个字段:sum(order_amount) as sum_amount,count(userkey) as count_user;
  3. 执行 having,此时才开始执行 group by 后的 having 操作,对 count_user 进行过滤,注意:因为上一步输出的只有 select 的两个字段了,所以 having 的过滤字段只能是这两个字段;
  4. 执行 limit,限制输出的行数为 10。

若join不是map join,那么在reduce阶段是如何执行join的呢?
图片转载链接: https://blog.csdn.net/u013660881/article/details/54600768.
图片转载链接: https://blog.csdn.net/u013660881/article/details/54600768[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GEGzU2P2-1633663960760)(D:\桌面\hive.assets\20190811142506604.png)]

三、HIVE分区与分桶

1、什么是分区

分区的目的就是提高查询效率,查询分区数据的方式就是指定分区名,指定分区名之后就不再全表扫描,直接从指定分区中查询,从hdfs的角度看就是从相应的文件系统中你指定的分区名会生成一个单独的文件,去这个指定文件中查找特定的数据

这个分区字段形式上存在于数据表中,在查询时会显示到客户端上,但并不真正在存储在数据表文件中,是所谓伪列。所以,千万不要以为是对属性表中真正存在的列按照属性值的异同进行分区。比如上面的分区依据的列name并不真正的存在于数据表中,是我们为了方便管理添加的一个伪列,这个列的值也是我们人为规定的

2、什么是分桶

分桶是相对分区进行更细粒度的划分。分桶将整个数据内容安装某列属性值得hash值进行区分,如要安装name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。

与分区不同的是,分区依据的不是真实数据表文件中的列,而是我们指定的伪列,但是分桶是依据数据表中真实的列而不是伪列。所以在指定分区依据的列的时候要指定列的类型,因为在数据表文件中不存在这个列,相当于新建一个列。而分桶依据的是表中已经存在的列,这个列的数据类型显然是已知的,所以不需要指定列的类型。

3、为什么要进行分桶

可提高查询效率,如:我们要对两张在同一列上进行了分桶操作的表进行JOIN操作的时候,只需要对保存相同列值的桶进行JOIN操作即可。同时分桶也能让取样(Sampling)更高效。

四、内部表与外部表

未被external修饰的是内部表(managed table),被external修饰的为外部表(external table);
区别:
内部表数据由Hive自身管理,外部表数据由HDFS管理;
内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定(如果没有LOCATION,Hive将在HDFS上的/user/hive/warehouse文件夹下以外部表的表名创建一个文件夹,并将属于这个表的数据存放在这里);
删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除,且删除后如果重新create相同的外部表数据不会变;

五、Hive 的函数:UDF、UDAF、UDTF 的区别

1、区别

UDF: 单行进入,单行输出
UDAF: 多行进入,单行输出
UDTF: 单行输入,多行输出

2、UDTF函数

①对array类型数据

hive> create table student_array(
    > name string,
    > course_score array<string>
    > )
    > row format delimited fields terminated by '\t'
    > collection items terminated by ','
    > stored as textfile;
hive> select * from student_array;
-chgrp: '*' does not match expected pattern for group
Usage: hadoop fs [generic options] -chgrp [-R] GROUP PATH...
OK
zs	["语文:86","数学:87.5","英语:90"]
ls	["语文:76","数学:93","英语:88"]
ww	["语文:88","数学:90","英语:95"]

对array类型的数据可以用explode函数将数组中的元素拆分,按行输出每个元素

hive> select explode(course_score) from student_array;
-chgrp: '*' does not match expected pattern for group
Usage: hadoop fs [generic options] -chgrp [-R] GROUP PATH...
OK
语文:86
数学:87.5
英语:90
语文:76
数学:93
英语:88
语文:88
数学:90
英语:95
select split(course_score,':')[1] from student_array

②对map类型的数据

hive> create table student_map(
    > name string,
    > course_score map<string ,float>
    > )
    > row format delimited fields terminated by '\t'
    > collection items terminated by ','
    > map keys terminated by ':'
    > stored as textfile;
hive> select * from student_map;
-chgrp: '*' does not match expected pattern for group
Usage: hadoop fs [generic options] -chgrp [-R] GROUP PATH...
OK
zs	{"语文":86.0,"数学":87.5,"英语":90.0}
ls	{"语文":76.0,"数学":93.0,"英语":88.0}
ww	{"语文":88.0,"数学":90.0,"英语":95.0}

对于map类型的数据,可以使用explode分开key和value类型的数据

hive> select explode(course_score) from student_map;
-chgrp: '*' does not match expected pattern for group
Usage: hadoop fs [generic options] -chgrp [-R] GROUP PATH...
OK
语文	86.0
数学	87.5
英语	90.0
语文	76.0
数学	93.0
英语	88.0
语文	88.0
数学	90.0
英语	95.0

③对于结构体类型的数据(map和array的集合)

hive> create table student_map(
    > name string,
    > course_score array<map<string ,float>>
    > )
    > row format delimited fields terminated by '\t'
    > collection items terminated by ','
    > map keys terminated by ':'
    > stored as textfile;
hive> select * from student_struct_array;
-chgrp: '*' does not match expected pattern for group
Usage: hadoop fs [generic options] -chgrp [-R] GROUP PATH...
OK
zs	[{"course":"语文","score":86.0},{"course":"数学","score":87.5},{"course":"英语","score":90.0}]
ls	[{"course":"语文","score":76.0},{"course":"数学","score":93.0}]
ww	[{"course":"语文","score":88.0},{"course":"数学","score":90.0},{"course":"英语","score":95.0}]
Time taken: 0.19 seconds, Fetched: 3 row(s)

可以使用inline函数进行拆分,注:不能使用UDTF函数进行嵌套

hive> select inline(course_score) from student_struct_array;
-chgrp: '*' does not match expected pattern for group
Usage: hadoop fs [generic options] -chgrp [-R] GROUP PATH...
OK
语文	86.0
数学	87.5
英语	90.0
语文	76.0
数学	93.0
语文	88.0
数学	90.0
英语	95.0

3、UDAF函数

①count,返回值为bigint

count(*):返回指定列检索到的行数,包括空值

count(expr):expr表达式不是NULL的行的数量

count(distinct) :返回去除重复后的行数

②sum,min,max,avg

常用函数,不予详细介绍

③返回值类型为array的函数

select filter_name ,
	collect_list(path_id),
	collect_set(path_id),
	concat_ws('@',collect_list(path_id)) a,
	concat_ws('@',collect_set(path_id)) b,
	concat_ws('@',collect_set(market_type)) c
from FDM_SOR.T_FIBA_MULTI_UBA_CFG_PATH_DETAIL_D 
where path_id >89
group by filter_name

img

4、UDF函数

①数学函数

函数名称说明
round(double d, int n)返回保留n位小数的近似d值
bin(int d)计算二进制值d的string值
rand(int seed)返回随机数,seed是随机因子
ceil(double d)返回大于d的最小整值
floor(double d)返回小于d的最大整值

②日期函数

函数名称说明
to_date(string timestamp)返回时间字符串中的日期部分,如to_date(‘1970-01-01 00:00:00’)=‘1970-01-01’
current_date返回当前日期
year(date)返回日期date的年,类型为int如year(‘2019-01-01’)=2019
month(date)返回日期date的月,类型为int,如month(‘2019-01-01’)=1
day(date)返回日期date的天,类型为int,如day(‘2019-01-01’)=1
weekofyear(date1)返回日期date1位于该年第几周。如weekofyear(‘2019-03-06’)=10
datediff(date1,date2)返回日期date1与date2相差的天数,如datediff(‘2019-03-06’,‘2019-03-05’)=1
date_add(date1,int1)返回日期date1加上int1的日期,如date_add(‘2019-03-06’,1)=‘2019-03-07’
date_sub(date1,int1)返回日期date1减去int1的日期,如date_sub(‘2019-03-06’,1)=‘2019-03-05’
months_between(date1,date2)返回date1与date2相差月份,如months_between(‘2019-03-06’,‘2019-01-01’)=2
add_months(date1,int1)返回date1加上int1个月的日期,int1可为负数。如add_months(‘2019-02-11’,-1)=‘2019-01-11’
last_day(date1)返回date1所在月份最后一天。如last_day(‘2019-02-01’)=‘2019-02-28’
next_day(date1,day1)返回日期date1的下个星期day1的日期。day1为星期X的英文前两字母如next_day(‘2019-03-06’,‘MO’) 返回’2019-03-11’
trunc(date1,string1)返回日期最开始年份或月份。string1可为年(YYYY/YY/YEAR)或月(MONTH/MON/MM)。如trunc(‘2019-03-06’,‘MM’)=‘2019-03-01’,trunc(‘2019-03-06’,‘YYYY’)=‘2019-01-01’
unix_timestamp()返回当前时间的unix时间戳,可指定日期格式。如unix_timestamp(‘2019-03-06’,‘yyyy-mm-dd’)=1546704180
from_unixtime()返回unix时间戳的日期,可指定格式。如select from_unixtime(unix_timestamp(‘2019-03-06’,‘yyyy-mm-dd’),‘yyyymmdd’)=‘20190306’

③条件函数

函数名称说明
if(boolean,t1,t2)若布尔值成立,则返回t1,反正返回t2。如if(1>2,100,200)返回200
case when boolean then t1 else t2 end若布尔值成立,则t1,否则t2,可加多重判断
coalesce(v0,v1,v2)返回参数中的第一个非空值,若所有值均为null,则返回null。如coalesce(null,1,2)返回1
isnull(a)若a为null则返回true,否则返回false

④字符串函数

函数名称说明
length(string1)返回字符串长度
concat(string1,string2)返回拼接string1及string2后的字符串
concat_ws(sep,string1,string2)返回按指定分隔符拼接的字符串
lower(string1)返回小写字符串
upper(string1)返回大写字符串
trim(string1)去字符串左右空格
split(string1,pat1)以pat1字符分隔字符串string1,返回数组。如split(‘a,b,c’,’,’)返回[“a”,“b”,“c”]
substr(string1,index1,int1)以index位置起截取int1个字符。如substr(‘abcde’,1,2)返回’ab’

5、HQL解析json格式数据

①解析json单个字符项

get_json_object

  • 语法:get_json_object(json_string, '$.key')
  • 说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。这个函数每次只能返回一个数据项。
  • 示例:
select 
get_json_object('{"name":"zhangsan","age":18}','$.name'); 
  • 结果:
name
zhangsan

如果既要解析name字段,也解析age字段,则可以这样写:

select 
get_json_object('{"name":"zhangsan","age":18}','$.name'),
get_json_object('{"name":"zhangsan","age":18}','$.age');

①解析json多个字符项

json_tuple

  • 语法: json_tuple(json_string, k1, k2 ...)
  • 说明:解析json的字符串json_string,可指定多个json数据中的key,返回对应的value。如果输入的json字符串无效,那么返回NULL。
  • 示例:
select 
b.name
,b.age
from tableName a lateral view
json_tuple('{"name":"zhangsan","age":18}','name','age') b as name,age;
  • 结果:
nameage
zhangsan18

注意:上面的json_tuple函数中没有$.

如果在使用json_tuple函数时加上$.就会解析失败:

select 
b.name
,b.age
from tableName a lateral view
json_tuple('{"name":"zhangsan","age":18}','$.name','$.age') b as name,age;

结果:

nameage
NULLNULL

字段全是NULL,所以json_tuple函数不需要加$.了,否则会解析不到。

③解析jsonb格式数据

如果有一个hive表,表中 json_str 字段的内容如下:

json_str
[{“website”:“baidu.com”,“name”:“百度”},{“website”:“google.com”,“name”:“谷歌”}]

我们想把这个字段解析出来,形成如下的结构:

websitename
baidu.com百度
google.com谷歌

要解析这个json数组,仅用上面介绍的两个函数就解析不出来了:

此时可以使用子查询通过explode将json数组转换为jsoin再使用上面介绍的两个函数进行解析

select
json_tuple(a.t,'website','name') b as website,name
from (
	select explode('[{"website":"baidu.com","name":"百度"},{"website":"google.com","name":"谷歌"}]') 
as json) t
) a

六、HIVE数据仓库

1、数据仓库搭建步骤

①用户行为数据采集平台搭建
②业务数据采集平台搭建
③数据仓库维度建模
④采用即席查询工具,随时进行指标分析
⑤对集群性能进行监控,发生异常需要报警

2、技术选型

数据采集传输:Flume,Kafka,Sqoop
数据存储: MySql,HDFS
数据计算:Hive,Spark
数据查询: Presto,Kylin
数据可视化:Superset
任务调度: Azkaban
集群监控: Zabbix

3、数据流图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ewmdNvvY-1633663960762)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20210917100311261.png)]

4、数据分层

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zEBc4YkM-1633663960764)(D:\桌面\hive.assets\210316_2.png)]

ODS(原始数据层):原始数据层,存放原始数据,直接加载原始日志、数据,数据保持原貌不做处理。

DWD层(明细数据层):对ODS层数据进行清洗(去除空值,脏数据,超过极限范围的数据)、脱敏等。保存明细数据,一行信息代表一次业务行为, 例如一次下单。

DWS层(服务数据层):以DWD为基础,对数据进行轻度汇总。如一行信息代表一个主题对象一天的汇总行为, 例如一个用户一天下单次数

DWT层(数据主题层):以DWS为基础,对数据进行累积汇总。如一行信息代表一个主题对象的累积行为,例如一个用户从注册那天开始至今-共下了多少次单

ADS层(数据应用层):前端应用直接读取的数据源;根据报表、专题分析需求而计算生成的数据。

ODS层是原始数据层也可被称为接口层

中间三层也被称为数据仓库层,每一层都是对上一层的累积和汇总。一般都是对数据关联的日期进行拆分,使得其更具体的分类,如拆分成年、月、日等,主要是明细数据,除此之外还有一些基于中间层数据统计出来的汇总数据

数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为是ETL(抽取Extra, 转化Transfer, 装载Load)的过程,ETL是数据仓库的流水线,也可以认为是数据仓库的血液,它维系着数据仓库中数据的新陈代谢,而数据仓库日常的管理和维护工作的大部分精力就是保持ETL的正常和稳定。

建设数据仓库犹如创造一条新的生命,分层架构只是这条生命的逻辑骨架而已。想要在骨架上长出血肉,就必须进行合适的数据建模,数据仓库的强壮还是孱弱,健美还是丑陋,就取决于建模的结果。

5、数据分层的优点

➢1)把复杂问题简单化 将复杂的任务分解成多层来完成,每一层只处理简单的任务,方便定位问题。

➢2) 减少重复开发 规范数据分层,通过的中间层数据,能够减少极大的重复计算,增加一次计算结果的复用性。

➢3) 隔离原始数据 不论是数据的异常还是数据的敏感性,使真实数据与统计数据解耦开。

➢4)用空间换时间 通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据。

➢5)通过数据分层管理可以简化数据清洗的过程 因为把原来一步的工作分到了多个步骤去完成,相当于把一个复杂的工作拆成了多个简单的工作,把一个大的黑盒变成了一个白盒,每一层的处理逻辑都相对简单和容易理解,这样我们比较容易保证每一个步骤的正确性,当数据发生错误的时候,往往我们只需要局部调整某个步骤即可。

6、维度建模

①事实表和维度表

**事实表(Fact Table)**是指存储有事实记录的表,如系统的日志、销售记录、用户访问日志等信息,事实表的记录是动态的增长的,所以体积是大于维度表。

如:用户访问日志(事实表):用户名、url、时间…

维度表(Dimension Table)也称为查找表(Lookup Table)是与事实表相对应的表,这个表保存了维度的属性值,可以跟事实表做关联,相当于是将事实表中经常重复的数据抽取、规范出来用一张表管理,常见的有日期(日、周、月、季度等属性)、地区表等,所以维度表的变化通常不会太大

常见的维度表有:地市维表、区县维表、资费维表、活动维表、渠道维表等

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hive知识点汇总 的相关文章

  • ios UILabel显示html文本

    let attrContent 61 try NSAttributedString data htmlContent options NSDocumentTypeDocumentAttribute NSHTMLTextDocumentTyp
  • 转行的辛苦

    我是2004年毕业的 xff0c 学的专业是市场营销 xff0c 毕业后来到深圳 xff0c 换了很多工作 xff0c 一直都无法找到令自己满意的工作 因为我非常喜欢计算机 xff0c 从中学到大学 xff0c 一直是班级里公认的计算机高手
  • 内存优化 和 性能优化 的总结

    从 检查内存 xff0c 减少使用 xff0c 复用 xff0c 以及及时释放几个维度去考虑 1 检查 可以ddms查看内存使用情况 xff0c 可以使用 adb shell dumpsys meminfo 查看 xff0c 也可以使用 l
  • ubuntu16.04 安装gnome经典桌面

    一直比较喜欢旧版本Ubuntu的Gnome风格的菜单栏 xff0c 在Ubuntu16 0 4中可以执行指令 xff1a sudo apt get install gnome session flashback 安装完成 xff0c 注销一
  • Gson在序列化反序列化中的TypeAdapter

    1 package waf json adatpter 2 3 import java io IOException 4 import java util ArrayList 5 import java util List 6 import
  • 技术泡妹子二:篡改百度首页,惊呆女神

    大多数网民上网的入口都是先打开百度 xff0c 然后再搜索xxx 进入 xff0c 为了给女神惊喜 xff0c 决定篡改百度首页让女神惊呆 xff0c 当然不是黑了百度 xff0c 目前没这个实力 xff0c 但是我们可以修改host文件
  • VC多线程中控制界面控件的几种方法

    转 http hi baidu com magicyang87 blog item 23bbf2fd72d6b81108244d73 html 为了保证界面的用户体验经常要把数据处理等放到子线程中进行 xff0c 然后把结果更新到主界面 x
  • 一次性打包学透 Spring

    不知从何时开始 xff0c Spring 这个词开始频繁地出现在 Java 服务端开发者的日常工作中 xff0c 很多 Java 开发者从工作的第一天开始就在使用 Spring Framework xff0c 甚至有人调侃 不会 Sprin
  • 关于产品的一些思考——写在前面的话

    自己是一个十足的Geek xff0c 喜欢使用各种新奇的东西 xff0c 包括软件 硬件 技术 xff0c 又因为自己一点点轻微的强迫症和完美主义 xff0c 在这个过程中总会有自己的一些思考 xff0c 又因为技术出身 xff0c 总会考
  • mybatis映射文件mapper.xml的写法。

    在学习mybatis的时候我们通常会在映射文件这样写 xff1a lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt DOCTYPE mapper PUBLIC 34 myba
  • layer的弹出层的简单的例子

    如果不了级的基本的清楚官网查看api网址为 http layer layui com 我用的是iframe 如果是iframe层 layer open type 2 content 39 http sentsin com 39 这里cont
  • 左链接Column 'id' in field list is ambiguous

    如题错误如左链接Column 39 id 39 in field list is ambiguous 今天在写sm的时候 xff0c 用到两个表的联合查询出现的如下的错误 xff0c 仔细查找才发现原来两个表的id重复了 xff0c use
  • maven出现:Failed to execute goal on project ...: Could not resolve dependencies for project ...

    1 我的项目结构是一个父项目 xff0c 多个子项目目录如下 xff1a 2 我这里就举个例子 xff0c 所以应用的也就是core和domain这两个项目 3 两个项目都继承父项目 4 在模块中domain依赖于core xff0c 在c
  • EOS的CPU危机:BM的租赁模式或只是乌托邦

    摘要 xff1a 继RAM内存之后 xff0c EOS的CPU危机也爆发了 昨日 xff0c 由于BetDice和EOSBET为了保证游戏的运行 xff0c 占用了过多的主网CPU xff0c 导致用户资源紧张 xff0c 甚至无法转账 昔
  • 有关Shiro中Principal的使用

    1 定义 principal代表什么那 xff1f 如果阅读官方文档或者源码你会得到如下的定义 xff1a 解释 xff1a 1 xff09 可以是uuid 2 xff09 数据库中的主键 3 xff09 LDAP UUID或静态DN 4
  • 关于shiro的 subject.getPrincipal()方法

    1 说明 上一篇文章说明了 principal xff0c 而subject getPrincipal 是用来干嘛的 xff0c 他就是来获取你存储的principal xff0c 内部是怎么获取的那 xff0c 多个principal怎么
  • CentOS7 64位安装solr7.2.0

    声明 xff1a 本人为学习solr的新手 xff0c 如编写过程中有部队的地方还请各位大佬指正 本文为原创 xff0c 如要转载请注明出处 你能学到 xff1a 1 linux上solr的安装部署 xff0c 官方给出的运行方式 2 添加
  • 阿里巴巴20121009 研发/算法工程师 笔试试题【修正】

    第19题 a i 在排序后的位置是 i k i 43 k xff0c a i 43 2k 在排序后的位置是 i 43 k i 43 3k xff0c 必然有a i lt 61 a i 43 2k 所以数组a里实际上有2k个各自有序的 交错的
  • Jetpakc LiveData ViewMode详解

    前言 xff1a 本文不定时更新 xff0c 有问题欢迎在评论区提出 最近更新时间 xff1a 2022 06 21 介绍 在2017年 xff0c 那时 xff0c 观察者模式有效的简化了开发 xff0c 但是诸如RxJava一类的库有一
  • ARM64 Linux kernel + busybox rootFS via NFS over QEMU with GDB

    由于条件所限 xff0c 一般选择软件做前期模拟 xff0c 这里做一些ARM 64 Linux kernel模拟运行环境搭建工作的总结 xff0c 记录以便后用 本文只涉及kernel 43 busybox rootFS via NFS

随机推荐

  • 寒假学习心得--从0开始学破解

    寒假学习心得 从0开始学破解 写给和我一样将要接触或者才接触破解 的朋友们 前提 你必须得真正喜欢 她 一 工欲善其事 必先利其器 1 找一个中文版的OD PEID 记得就OD就有咱PYG版的某牛人强化版的等等等等 找一个合适的工具 干起事
  • 常用的“密码重置”代码

    61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • ORACLE多表查询优化

    转自某地 对作者很愧疚 不晓得地址了 ORACLE 多表查询优化 这里提供的是执行性能的优化 而不是后台数据库优化器资料 参考数据库开发性能方面的各种问题 收集了一些优化方案统计如下 当然 象索引等优化方案太过简单就不列入了 嘿嘿 执行路径
  • Word to PDF Converter v3.0 算法分析及注册机

    Word to PDF Converter v3 0算法分析及注册机 详细过程 1 xff0c 主程序在C Program Files doc2pdf DOC2PDF dll xff0c PEID查壳为ASProtect 1 23 RC1
  • Debian11连不上网络问题

    有时候可以连上 xff0c 有时候就连不上 连不上的时候 xff0c 使用ifconfig命令 xff0c 只能看到回环接口 xff0c 看不到分配的网络IP地址 最后终于解决了 xff0c 记录一下 xff0c 以防之后出现同样的问题 1
  • 安全策略调整步骤

    1 修改防火墙 xff0c 保留22 SSHD 8081 APACHE 80 关闭端口443 HTTPS 3306 MYSQL 8080 8088 53 123 2 针对PHP的BUG和安全漏洞 xff0c 只有升级版本一途 xff0c 经
  • 获取微信openid(或昵称头像)的授权登录及其代理

    lt php 本页用于微信授权登录及其代理 64 version V2 0 64 author ty1921 lt ty1921 64 gmail com gt 64 param backurl 传get参数backurl xff0c 则授
  • 常用的PHP文件头和HTML5文件头(含移动端)

    lt php PHP Header Created by ty1921 64 gmail com Ver V1 Date 2017 8 18 1 session session start 2 display errors ini set
  • VB+PHP实现在线修改Windows服务器的配置文件

    本文仅供记录 存档备案用 用途 xff1a 某电话转接系统 xff0c 需要每天修改配置文件 并重启服务端程序 原理 xff1a WEB用于展示修改界面 xff0c 提交 保存配置文件的相关数据 VB端用于定时轮训WEB上保存的数据 xff
  • 按键精灵的5级开发认证,笔试题参考

    4题是抄的 xff0c 只是为了过级 最后得93分 xff0c 可能代码还是不够最优 xff0c 有看出的大大希望能不吝指点 1 写一个脚本 xff0c 要求启动时 xff0c 记录 xff08 录制 xff09 当前鼠标的移动轨迹 xff
  • Linux for Ubuntu用gdebi安装deb文件

    在bantu中安装deb文件有时很不方便 xff0c 通常默认用的安装器并效果并不理想 xff0c 有时用命令吧 xff0c 太多又繁琐 所以有个软件叫GDebi xff0c 可以更加有效的帮助安装deb 首先安装gdebi程序 xff0c
  • Xshell连接后又断开问题(Disconnected from remote host)

    Last login Fri Nov 1 12 36 08 2019 from 10 0 1 25 Connection closed by foreign host Disconnected from remote host 20 0 0
  • ubuntu-16.04.6安装教程

    下载Ubuntu16 04 xff08 1 xff09 下载地址 xff1a http releases ubuntu com 16 04 记得要下载iso文件如 ubuntu 16 04 desktop amd64 iso xff0c 3
  • Hive安装详细步骤

    一 下载hive 下载hive 地址 xff1a http mirror bit edu cn apache hive 二 安装mysql 执行以下几个命令安装8 0版本mysql 1 下载MySQLyum源 xff08 8 0版本的 xf
  • LL(1)文法的语法分析java实现

    java代码如下 xff1a package 文法分析器 import java io BufferedReader import java io FileInputStream import java io InputStreamRead
  • CSDN,我的良师益友

    鲁迅曾说过 xff1a 不是缺乏天才 xff0c 而是缺乏培养天才的土壤 对于中国的 IT 行业来说 xff0c 从来不缺乏技术英雄 xff0c 缺少的是铸就技术英雄的平台 而 CSDN 就给了我们这样一个平台和机会 xff0c 所以我们是
  • 构造中小型园区网实训案例

    构造中小型园区网实训案例 一 实验工具与实验拓扑规划1 实验工具2 实验拓扑 二 需求分析三 数据规划四 实施步骤步骤1 xff1a 配置所有终端步骤2 xff1a 配置所有接入层交换机步骤3 xff1a 配置网关路由器AR1 公网路由器A
  • 软件工程复习

    第一章 xff1a 课程概述 1 1 软件危机 1 1 1 计算机软件的四个发展阶段 程序设计阶段 程序系统阶段 软件工程阶段 面向对象阶段 1 1 2 什么是软件危机 xff08 考点 xff09 软件危机是指在计算机软件的开发和维护过程
  • ArrayDeque底层实现

    一 什么是ArrayDeque 1 Deque与Queue 了解这个之前 xff0c 我们要先知道什么是Deque xff0c 它和Queue有什么区别 xff1a 在java中 xff0c Queue被定义成单端队列使用 xff0c De
  • Hive知识点汇总

    HIVE 一 Hive的优化 数据倾斜 xff1a shuffle之后Key的分布不均导致分配到Reduce端的数据不均匀 xff0c 出现个别Reduce的数据过大 xff0c 执行时间过长而出现的现象 1 数据倾斜产生的原因 xff1a