目录

前言

  1. CREATE TABLE 表名 AS SELECT……
  2. INSERT
    2.1 无分区表插入数据
    2.2 分区表插入数据
    2.2.1 静态分区插入
    2.2.2 动态分区插入
    2.2.3 静态分区和动态分区混合使用

前言
我们在入门篇(十)中介绍了如何将文件中的数据导入一个表中。但实际工作中,更常用的数据插入操作是:将查询出的数据插入一个表中。实现这个操作有两种方法,1:使用CREATE TABLE 表名 AS SELECT……语句;2:使用INSERT语句。下文中我们会分别详细介绍这两种语句的用法。

  1. CREATE TABLE 表名 AS SELECT……
    这个语句的含义是:创建一个表,将后面SELECT语句查询出的数据插入这个新创建的表,字段名和字段数据类型全都和查询出来的数据保持一致。

1.1 语法
CREATE TABLE 表名1 AS
SELECT *
FROM 表名2;
后面的select语句可以使用所有合法的查询语句,但只能跟一条HQL语句,因此复杂查询会需要多层子查询嵌套,而且此语句不支持使用with as 语句,所以逻辑复杂时可读性较差。

1.2 应用场景
当数据需求较为复杂时,我们会先建立一些逻辑较为简单的中间临时表,此时使用这个语句会十分方便。

1.3 举例
这里我们使用之前博客的语句进行演示,语句如下:

CREATE TABLE temp_test AS
SELECT user_id
,use_cnt
FROM app.t_od_use_cnt
WHERE date_8 = 20190101 limit 5;
运行后查询新建的表temp_test,运行结果如下:

hive (app)> select * from temp_test;
OK
temp_test.user_id temp_test.use_cnt
10004 29
10003 1
10002 23
10001 49
10000 6
Time taken: 0.085 seconds, Fetched: 5 row(s)
2. INSERT
INSERT语句可以将查询出的数据插入一个已经建好的表中,查询所得数据的列顺序必须与已存在表中的列顺序一致。

2.1 无分区表插入数据
无分区表插入数据的操作一般用于向临时表中插入数据,因为一般只有临时表才不需要分区。

2.1.1 语法
插入数据覆盖表中的原有数据

INSERT overwrite TABLE 表名
SELECT * FROM ……;
插入数据追加在表中原有数据的后面,原有数据不会删除

INSERT INTO TABLE 表名
SELECT * FROM ……;
这里的查询语句同样只能跟一条HQL语句,因此复杂查询会需要多层子查询嵌套,但是,此语句支持使用with as 语句。

当使用WITH AS语句时语法如下:

WITH a
AS (……)
,b
AS (……)
……
INSERT into | overwrite TABLE 表名
SELECT ……;
只要将WITH AS 语句最后的那个SELECT语句放在INSERT语句后即可。

2.1.2 应用场景
当需要建的临时中间表逻辑较为复杂,使用子查询可读性较差时,可以使用先建一个临时表,然后使用WITH AS ……INSERT语句将查询所得数据插入表中。

2.1.3 举例
这里我们向上文新建的temp_test表插入10条数据,并覆盖之前的数据,这里使用两种语句进行演示,效果是一样的:

直接插入
INSERT overwrite TABLE temp_test
SELECT user_id
,use_cnt
FROM app.t_od_use_cnt
WHERE date_8 = 20190101 limit 10;
WITH AS插入
WITH a
AS (
SELECT user_id
,use_cnt
FROM app.t_od_use_cnt
WHERE date_8 = 20190101 limit 10
)
INSERT overwrite TABLE temp_test
SELECT *
FROM a;
查询表temp_test,运行如下:

hive (app)> select * from temp_test;
OK
temp_test.user_id temp_test.use_cnt
10009 40
10008 25
10007 40
10006 12
10005 15
10004 29
10003 1
10002 23
10001 49
10000 6
Time taken: 0.075 seconds, Fetched: 10 row(s)
可见之前的数据已被覆盖,重新插入了10条数据。

2.2 分区表插入数据
在前面的博客我们讲过:Hive 是存储在 HDFS 上的,Hive 的一个分区名对应一个目录名,子分区名就是子目录名,分区字段并不是一个实际字段。在Hive中向分区表中插入数据有两种操作,一种是静态分区插入,一种是动态分区插入,下文我们来分别详细介绍。

2.2.1 静态分区插入
2.2.1.1 语法:

[WITH a
AS (……)
,b
AS (……)
……]
INSERT into | overwrite TABLE 表名 PARTITION(分区字段1=‘xxx’,分区字段2=‘xxx’……)
SELECT ……;
所谓静态分区就是在INSERT语句后 指定要插入的分区的值,如果不写关键字partition直接插入,会报错;

分区字段有几个,插入时就要指定几个分区,否则会报错;

SELECT后的字段不能包含分区字段;否则会报错;

如果分区字段的数据类型为STRING,需要将内容用 ‘ ’ 括起来,如果是数值型则无需 ‘ ’。

2.2.1.2 应用场景:

静态分区插入数据一般用于日常的报表例行化操作中,每天脚本跑昨天的数据,然后指定插入到昨天的分区当中。

2.2.1.3 举例:

建立一个分区表temp_test1,语句如下:

CREATE TABLE temp_test1 (
user_id BIGINT comment ‘用户id’
,use_cnt INT comment ‘当日使用次数’
) partitioned BY (
date_8 INT
,hour INT
);
如果对分区表插入数据如果不写关键字partition直接插入,会报错,如下:
hive (app)>
> WITH a
> AS (
> SELECT user_id
> ,use_cnt
> FROM app.t_od_use_cnt
> WHERE date_8 = 20190101 limit 10
> )
> INSERT overwrite TABLE temp_test1
> SELECT *
> FROM a;
FAILED: SemanticException 8:23 Need to specify partition columns because the destination table is partitioned. Error encountered near token ‘temp_test1’
hive (app)>
如果只指定date_8或者hour其中一个分区插入数据,会报错,如下:
hive (app)> WITH a
> AS (
> SELECT user_id
> ,use_cnt
> FROM app.t_od_use_cnt
> WHERE date_8 = 20190101 limit 10
> )
> INSERT overwrite TABLE temp_test1 PARTITION(date_8=20190101)
> SELECT *
> FROM a;
FAILED: SemanticException [Error 10006]: Line 8:44 Partition not found ‘20190101’
hive (app)>
hive (app)> WITH a
> AS (
> SELECT user_id
> ,use_cnt
> FROM app.t_od_use_cnt
> WHERE date_8 = 20190101 limit 10
> )
> INSERT overwrite TABLE temp_test1 PARTITION(hour=1)
> SELECT *
> FROM a;
FAILED: SemanticException Line 0:-1 Partition not found ‘1’
hive (app)>
正确写法:

INSERT overwrite TABLE temp_test1 PARTITION (
date_8 = 20190101
,hour = 1
)
SELECT user_id
,use_cnt
FROM app.t_od_use_cnt
WHERE date_8 = 20190101 limit 10;
WITH a
AS (
SELECT user_id
,use_cnt
FROM app.t_od_use_cnt
WHERE date_8 = 20190101 limit 10
)
INSERT overwrite TABLE temp_test1 PARTITION (
date_8 = 20190101
,hour = 1
)
SELECT *
FROM a;
二者效果一致。

查询表temp_test1,运行效果如下:

hive (app)> select * from temp_test1 where date_8=20190101 and hour=1;
OK
temp_test1.user_id temp_test1.use_cnt temp_test1.date_8 temp_test1.hour
10009 40 20190101 1
10008 25 20190101 1
10007 40 20190101 1
10006 12 20190101 1
10005 15 20190101 1
10004 29 20190101 1
10003 1 20190101 1
10002 23 20190101 1
10001 49 20190101 1
10000 6 20190101 1
Time taken: 0.34 seconds, Fetched: 10 row(s)

hive (app)> select * from temp_test1 where date_8=20190101;
OK
temp_test1.user_id temp_test1.use_cnt temp_test1.date_8 temp_test1.hour
10009 40 20190101 1
10008 25 20190101 1
10007 40 20190101 1
10006 12 20190101 1
10005 15 20190101 1
10004 29 20190101 1
10003 1 20190101 1
10002 23 20190101 1
10001 49 20190101 1
10000 6 20190101 1
Time taken: 0.112 seconds, Fetched: 10 row(s)

hive (app)> select * from temp_test1 where hour=1;
OK
temp_test1.user_id temp_test1.use_cnt temp_test1.date_8 temp_test1.hour
10009 40 20190101 1
10008 25 20190101 1
10007 40 20190101 1
10006 12 20190101 1
10005 15 20190101 1
10004 29 20190101 1
10003 1 20190101 1
10002 23 20190101 1
10001 49 20190101 1
10000 6 20190101 1
Time taken: 0.073 seconds, Fetched: 10 row(s)
可见在查询分区表时,指定其中一个分区就不会报错,但插入时必须全部指定。

2.2.2 动态分区插入
启用 hive 动态分区,首先需要在 hive 会话中设置两个参数:

是否允许动态分区,默认值:false
set hive.exec.dynamic.partition=true;

strict模式是避免全分区字段是动态的,必须有至少一个分区字段是指定有值的,默认值:strict
set hive.exec.dynamic.partition.mode=nonstrict;
另外,如果要插入的分区大于100个小于1000个,需要修改如下参数,否则运行到reduce阶段会报错。

此参数用来限制每个mapper或者reducer的最大动态分区数,默认值是100,此处修改为1000
set hive.exec.max.dynamic.partitions.pernode=1000;
如果要插入的分区大于1000个,需要修改如下参数,否则运行到reduce阶段会报错。

此参数用来限制每个节点的最大动态分区数,默认值是100,此处修改为为符合需求的值即可。
set hive.exec.max.dynamic.partitions.pernode=2000;

此参数用来限制一个DML操作可以创建的动态分区的总分区数,默认值为1000,此处修改为符合需求的值即可。
set hive.exec.max.dynamic.partitions=2000

2.2.2.1 语法:

[WITH a
AS (……)
,b
AS (……)
……]
INSERT into | overwrite TABLE 表名 PARTITION(分区字段1,分区字段2……)
SELECT ……分区字段1,分区字段2……
FROM ……;
动态分区插入数据时只需要写出分区字段名,并不指定具体的分区,然后在下面的查询中最后几个字段必须包含有动态分区的字段,且顺序必须和PARTITION后的分区字段完全一致。

因为hive 会先获取 select 的最后几个位置的分区字段的参数值,然后将这些值填写到 insert 语句 partition 中的几个分区字段中,即动态分区是通过位置来对应分区值的。原始表 select 出来的值和输出 partition 的值的关系仅仅是通过位置来确定的,和名字并没有关系!

2.2.2.2 应用场景:

动态分区插入数据多用于例行化表的回溯数据,比如要将过去30天每天的数据插入一张按天分区的表,如果使用静态分区回溯数据,需要跑30次脚本才行,而使用动态分区则可以一次性全部插入。
https://blog.csdn.net/sturgsslecofwe/article/details/97927310
https://blog.csdn.net/sturgsslecofwe/article/details/97927443
https://blog.csdn.net/sturgsslecofwe/article/details/97937891

2.2.2.3 举例:

如果没有设置参数就使用动态分区,会报错:
hive (app)> INSERT overwrite TABLE temp_test1 PARTITION (
> date_8
> ,hour
> )
> SELECT user_id
> ,use_cnt
> ,date_8
> ,12 hour
> FROM app.t_od_use_cnt
> WHERE date_8 = 20190102 limit 10;
FAILED: SemanticException [Error 10096]: Dynamic partition strict mode requires at least one static partition column. To turn this off set hive.exec.dynamic.partition.mode=nonstrict
如果少查询一个分区字段,会报错:
hive (app)> INSERT overwrite TABLE temp_test1 PARTITION (
> date_8
> ,hour
> )
> SELECT user_id
> ,use_cnt
> ,date_8
> FROM app.t_od_use_cnt
> WHERE date_8 = 20190102 limit 10;
FAILED: SemanticException [Error 10044]: Line 1:23 Cannot insert into target table because column number/types are different ‘hour’: Table insclause-0 has 4 columns, but query has 3 columns.
如果顺序写错,代码不会报错,但插入的数据是错误的:
INSERT overwrite TABLE temp_test1 PARTITION (
date_8
,hour
)
SELECT user_id
,use_cnt
,12 hour
,date_8
FROM app.t_od_use_cnt
WHERE date_8 = 20190102 limit 10;
查询表中数据,可以看到虽然字段都有,但最后两个分区字段的内容是错误的:

hive (app)> select * from temp_test1;
OK
temp_test1.user_id temp_test1.use_cnt temp_test1.date_8 temp_test1.hour
10209 39 12 20190102
10208 26 12 20190102
10207 46 12 20190102
10206 39 12 20190102
10205 47 12 20190102
10204 30 12 20190102
10203 18 12 20190102
10202 31 12 20190102
10201 13 12 20190102
10200 46 12 20190102

正确写法:

先设置参数,这些设置只在本次会话中生效,如果想永久生效,可以将其写入.hiverc文件中,具体可参见入门篇(十一)。然后使用动态分区向表temp_test1中插入数据,这里因为表t_od_use_cnt中没有hour字段,所以hour我们直接人为设定一个12:
https://www.qichamao.com/person/e6bd3680c1dbbf86def429e97f0f337e0a00cbde2c0ae816e34b7f38a4da6854-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/cf0fb6f519ee8303a49cc18ee94cbb57234cc5acd34f8a50b18ec8a9354a4c26-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/1c345af03f314e39de9a1f2af5a9888f2a9f766ddc5d93ab8833fbe315d461c7-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/df0fa9ef0eddcb17e85fa68c7b75f4fab4b33bc785a23b42398a4ed46e21b77a-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/3f03ee098b3d8f4fa8d5cf34596cf7ffbaf97aefc0b1d3d4952e3287c29529b6-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/732e94895abd2638da4f860a7132cd2409b6d6d15aa7babd6a5d05e967f1c0eb-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/944376ddb99a469e8693c44cd764c59854662ec6c8f09bb75696366e653012b870d70a8754d9d3074de3eed10c69d082-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/42fc1ca4e202b58f4a0df2816a1e5f5c798da332d3f23a3c2dc10cf581f11c0628da66f955e0269b10cf9123ad94a80a-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/b211599bcec337c781fa43a2381f6dc8c13c3ca76d537fb07db4c448a7f6a059-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/880e77f88c4560f2e6f14ed67a2bd4853106c81961680eba0ace2d0c74f12458-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/4f890118a8fdb1be2f74604646f805efe1cd55db6c655cd49c6d6bb95d5154d0-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/637ea82eb611aa9fb9596ace3847509bd97d23a79e791f9d80ec5e90c0eb4c0c-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/0e29a0cba6b199a0512738cff27855df8ca4077fd1b20aa6de94f180faa938b2-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/51b089246a95918323eaf9d096521ecf5e2c7c928e96dd4ae7f0208a120411a1-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/e20f3c66fee9b3b1f2058493756e0669c9cabaedc8f4ccee8de51f751b37f971-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/bea69ae3bbcb796dcbce9201071f573fb8d671b81d2dd26463853cfad5f45911-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/3eaee26f7455cf48d1667cb83b4ffd990e19b02e12609f4336473daa64b09f06-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/27973d842287da6adca879a0f2aeb038cf8e05482bffc6eff93e2415a0dc1feefbceb03c1a575ad216897758dc7fb1c7-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/fc3a3631de936787a05db985c80ff0b0a986c09de43ac8faa25a1d1fbf3aeecb-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/bd55ac66bedffa2e522dab2e320def3d7b6b1e82e13746b35db1cd729f43a469-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/520b08cae6c21349569338a3094e0253fcf86cc59232c43077168e65face49ae-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/e113c531d5a7ef40c3298015d7bb954b9fb20dc2498edd0369963948b2f40cb1-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/7b2857bc1bad1c5f333fefcb4c653b5b679b34e211023508777db4f5fccc51a7-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/8b802ebb01bd89dd80ec0f305f1314cc30318dbab9ae5b8398a587ed8422baa0-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/f312b82bcdeae66aaea8b10118222667b7b0bd29ef6bfac6d33a88acd6d07b30-2a6e52ffdd387b1510b9e27362ee9011
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
INSERT overwrite TABLE temp_test1 PARTITION (
date_8
,hour
)
SELECT user_id
,use_cnt
,date_8
,12 hour
FROM app.t_od_use_cnt
WHERE date_8 = 20190102 limit 10;
查询分区date_8=20190102,hour=12中的数据:

hive (app)> select * from temp_test1 where date_8=20190102 and hour=12;
OK
temp_test1.user_id temp_test1.use_cnt temp_test1.date_8 temp_test1.hour
10209 39 20190102 12
10208 26 20190102 12
10207 46 20190102 12
10206 39 20190102 12
10205 47 20190102 12
10204 30 20190102 12
10203 18 20190102 12
10202 31 20190102 12
10201 13 20190102 12
10200 46 20190102 12
Time taken: 0.077 seconds, Fetched: 10 row(s)
2.2.3 静态分区和动态分区混合使用
静态分区和动态分区混合使用时,静态分区值必须在动态分区值的前面,否则会报错。

举例:

如果动态分区值必须在静态分区值的前面,报错如下:

hive (app)> set hive.exec.dynamic.partition=true;
hive (app)> set hive.exec.dynamic.partition.mode=nonstrict;
hive (app)> INSERT overwrite TABLE temp_test1 PARTITION (
> date_8
> ,hour=1
> )
> SELECT user_id
> ,use_cnt
> ,12 hour
> FROM app.t_od_use_cnt
> WHERE date_8 = 20190101 limit 10;
FAILED: SemanticException [Error 10094]: Line 2:6 Dynamic partition cannot be the parent of a static partition ‘1’
正确写法:

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
INSERT overwrite TABLE temp_test1 PARTITION (
date_8=20190101
,hour
)
SELECT user_id
,use_cnt
,12 hour
FROM app.t_od_use_cnt
WHERE date_8 = 20190101 limit 10;


作者:风影楼前
来源:CSDN
原文:https://blog.csdn.net/qq_23897391/article/details/93377800
版权声明:本文为博主原创文章,转载请附上博文链接!

表t_od_use_cnt中没有hour字段,所以hour我们直接相关推荐

  1. mysql中如何求字段的个数字_求高手帮小弟解决一下!关于mysql字段中数字提取求和的问题?...

    例如表1中的No字段是字符串类型,no字段中包含数字及符号,如20+1.5,8+5+4等 那么有办帮法提取出20,1.5,8,5,4这些数字来进行求和等于38.5吗?语句怎么样写? 解决方案 30 提 ...

  2. PostgreSQL 中的系统字段:tableoid、xmin、xmax、cmin、cmax、ctid

    文章目录 tableoid ctid xmin xmax cmin cmax oid 总结 大家好!我是只谈技术不剪发的 Tony 老师.今天我们来谈谈 PostgreSQL 数据表中几个隐藏的系统字 ...

  3. mysql不可对视图的操作_在数据表视图中不能进行的操作是什么

    在数据表视图中不能进行的操作是什么? 在数据表视图中不能进行的操作是修改字段的类型. 在"数据表"视图中可以进行字段的编辑.添加.删除,记录的删除和数据查找等操作,但使用" ...

  4. 如何判断数据库中的两个表是否相同(相等)?比较数据库中的两个表是否完全相同,包括字段和每条记录

    如何判断数据库中的两个表是否相同(相等)?比较数据库中的两个表是否完全相同,包括字段和每条记录 目录

  5. oracle遍历表做查询,oracle 语句之对数据库的表名就行模糊查询,对查询结果进行遍历,依次获取每个表名结果中的每个字段(存储过程)...

    语句的执行环境是plsql的sql窗口, 语句的目的是从整个数据库中的所有表判断 不等于某个字段的记录数 . 代码如下: declare s_sql clob:=''; -- 声明一个变量,该变量用于 ...

  6. SQL 触发器 当修改TEST表中的F1字段时,同时根据条件修改F2字段

    Code --当外修改TEST表中的F1字段时,同时根据条件修改F2字段 ALTER TRIGGER [dbo].[updatetest1] ON [dbo].[TEST]  FOR INSERT,  ...

  7. mysql 查询指定字段数据_MySQL使用select语句查询指定表中指定列(字段)的数据

    本文介绍mysql数据库中执行select查询语句,查询指定列的数据,即指定字段的数据. 再来回顾一下sql语句中的select语句的语法: select 语句的基本语法: select from w ...

  8. 修改Mysql表中自增字段的初始值

    修改Mysql表中自增字段的初始值: ALTER TABLE employee AUTO_INCREMENT=2; 解释:将表employee自增字段的初始值设置为2

  9. Sqlserver别太信任SysComments表中的text字段

    1.用SysComments的原因 最近新模块的开发,需要更改和新增的存储过程比较多,为了同步开发环境和测试环境的存储过程,能在更新程序后,马上能整理出更改的存储过程脚本,并更新到测试DB服务器上,我 ...

  10. 查询一个表中所有id字段在另一个表中对应值的SQL语句怎么写?

    编辑器加载中... 查询一个表中所有id字段在另一个表中对应值的SQL语句怎么写?多表联结查询:select rbd.RBDID, rbd.ProductCode,p.ProductCnName,p. ...

最新文章

  1. 实现全屏轮播,并且轮播div中的文字盒子一直自动垂直居中
  2. 【NLP】如何利用BERT来做基于阅读理解的信息抽取
  3. VTK:可视化算法之ExponentialCosine
  4. 证监会:《证券期货业信息安全保障管理办法(征求意见稿) 》公开征求意见...
  5. java接口的修饰符可以为,附架构师必备技术详解
  6. ruby 嵌套函数_Ruby嵌套有示例的循环
  7. snapchat_机器中的幽灵:Snapchat不是移动优先的-完全是另一回事
  8. D-S证据理论基本概念
  9. hdu 2159 FATE
  10. 初识DOM(文档对象模型)
  11. SQL Server迁移数据库文件(ldfmdf文件)到其他盘
  12. 这 173 家牛逼的互联网国企!值得你加入
  13. 成都移动IPV6光猫设置教程
  14. 聚类总结(中)——密度聚类
  15. python 软件包 petri_常用Petri网模拟软件工具简介
  16. 关于NLSSORT和NLS_SORT的用法
  17. Win系统 - 局域网内电脑文件共享
  18. CAD工程图纸转jpg格式教程
  19. 蒲丰投针实验原理_神奇的圆周率——布丰投针实验
  20. 你还在怕忘记网盘密码?商鼎云助记词登录保障你的安全

热门文章

  1. 捕鱼达人 FishMaster 记录(Done)
  2. 别人的Python爬虫代码能读懂,自己却还是不能自由去爬?社群日报
  3. 反编译获取任何微信小程序源码——看这篇就够了
  4. PMP22年免费补考来袭 | 送上180道历年PMP考试试题及答案解析
  5. python库参考_Python库参考手册(Python Library Reference)
  6. 遗传算法(Genetic Algorithm, GA)及MATLAB实现
  7. 2014计算机二级办公软件高级应用技术,计算机二级办公软件高级应用技术跟ms office一级考试的内容是不是一样的...
  8. 《3D数学基础:图形与游戏开发》
  9. ie9服务器win2008系统离线安装包,IE9离线安装包完整版
  10. 2021软考资料汇总:历年真题/学习手册/学习计划/考试大纲等资料