hive&greenplum ╰半橙微兮° 2022-12-29 12:48 214阅读 0赞 # 学习目标: # hive编程&greenplum实战 主要掌握查询语句 -------------------- # 学习内容: # ## 1、 Hive基础(内部原理):Hadoop生态系统中的hive ## **Hive的出现:** 通过HiveQL帮助用户从现有的基于sql的数据基础架构转移到Hadoop上。Hive可以将大多数查询转换为MapReduce任务(job)。 **Hive的限制(缺陷):** Hive 不是一个完整的数据库,Hive不支持记录级别的更新、插入或者删除操作(但是用户可以通过查询生成新表或者将查询结果导入到文件中);Hadoop是一个面向批处理的分布式文件系统,MapReduce 任务的启动过程需要消耗较长的时间,所以Hive延时较长;Hive不支持事务(OLTP),Hive更接近OLAP(联机分析技术)工具。 **Hadoop和MapReduce:** MapReduce是一种计算模型:将大型数据处理任务分解成很多单个的、可以在服务器集群中并行执行的任务。并且这些任务的计算结果可以合并成最终结果 在MapReduce计算框架中,某个键的所有键值对都会被分发到同一个reduce操作中,即:这个键和这个键所对的所有值都会被传递给同一个Reducer。reduce过程就是将值的集合转换成一个值(累加求和或者求平均值),或者转换成另一个集合。这个Reduce最终会产生一个键值对。需要注意的是:输入和输出的键和值可能是不同的 Hadoop分布式文件系统中,每个数据块(block)都会被冗余多分(默认三份),这样可以保证不会因为单个硬盘或服务器的损坏(挂掉)导致数据丢失。 ## 2、 HiveQL(建表、增删改、查询) ## HiveQL是Hive查询语言,Hive 不支持行级插入、更新和删除操作。 **Hive中的数据库** :本质上是表的一个目录或者命名空间。 **创建数据库:** hive> CREATE DATABASE financials; hive> CREATE DATABASE IF NOT EXISTS financials; # 避免该数据库已经存在而抛出错误信息的情况 **查看Hive中包含的数据库:** hive> SHOW DATABASES; # >>>default financials hive> CREATE DATABASE human_resources; hive> SHOW DATABASES; # defaulut financials human_resources **用正则表达式筛选需要的数据库名:** hive> SHOW DATABASES LIKE 'h.*' ; # 即筛选出所有以字母h开头,以其他字符结尾(.*)的数据库名 **修改数据库的默认位置:** hive> CREATE DATABASE financials > COMMENT 'Holds all financial tables' ; # 为这个数据库添加描述信息 hive> DESCRIBE DATABASE financials; # >>> financials Holds all financials tables hdfs://master-server/user/hive/warehouse/financials.db **DESCRIBE DATABASE** 会显示出这个数据库所在的文件目录位置路径 **为数据库增加键值对属性信息,通过DESCRIBE DATABASE EXTENDED <database>语句显示这些信息** hive> CREATE DATABASE finacials > WITH DBPROPERTIES ('creators' = 'Mark Moneybags', 'date' = '2012-01-02'); hive> DESCRIBE DATABASE EXTENDED financials; # >>> financials Holds all financials tables hdfs://master-server/user/hive/warehouse/financials.db {date=2012-01-02, creator=Mark Moneybags}; **USE命令:将某个数据库设置为当前工作数据库** hive> USE financials ; **删除数据库:** hive> DROP DATABASE IF EXISTS financials; **Hive不允许删除一个包含有表的数据库,加上CASCADE关键字就可以先删除表再删除库** hive> DROP DATABASE IF EXISTS financials CASCADE ; ***修改数据库*** hive> ALTER DATABASE financials SET DBPROPERTIES('edited-by' = 'Joe Dba'); 注意:没有办法删除或者重置数据库属性 **创建表** CREATE TABLE IF NOT EXISTS mydb.employees( name STRING COMMENT 'Employee name', salary FLOAT COMMENT 'Employee salary', subordinates ARRAY<STRING> COMMENT 'Name of subordinates', deductions MAP<STRING, FLOAT> COMMENT 'Keys are deductions names, values are percentages' , address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT> COMMENT 'Home adress') COMMENT 'Description of the table' TBLPROPERTIES ('creator' = 'me', 'created_at' = '2012-01-02 10:00:00', ...) LOCATION '/user/hive/warehouse/mydb.db/employees'; **TBLPROPERTIES** 的主要作用是按键值对的格式为表增加额外的文档说明。 **拷贝一张已经存在的表** CREATE TABLE IF NOT EXISTS mydb.employees2 LIKE mydb.emplyees; **SHOW TABLES命令**: hive> USE mydb; hive> SHOW TABLES; hive> USE default; hive> SHOW TABLES IN mydb; # 指定数据库下的表 hive> USE mydb; hive> SHOW TABLES 'empl.*' ; # 正则表达式 hive> DESCRIBE EXTENDED mydb.employees; # 查询表的详细信息 EXTENDED 可以用FORMATTED关键字替代 hive> DESCRIBE mydb.emplyees.salary; # 查看某一列的详细信息 **内部表(管理表)和外部表(EXTERNAL TABLE)** 删除内部表也会删除表中的数据,删除外部表不会删除掉这份数据,不过描述表的元数据信息会被删除掉。 创建外部表,指向其他目录(外部)的数据,从而可以使用hive在外部数据上执行一些查询。 **分区表:PARTITIONED BY (country STRING, state STRING )** 作用:提高查询效率 **删除表:** DROP TABLE IF EXISTS employees; **修改表**: ALTER TABLE log_messages RENAME TO logmsgs; # 表的重命名 ALTER TABLE log_messages ADD IF NOT EXISTS PARTITION (year = 2011, month = 1 , day = 1) LOCATION '/logs/2011/01/01' # 增加表分区 # 关键字ADD改为DROP则是删除表分区 **修改列信息** ALTER TABLE log_messages CHANGE COOLUMN hms hours_minutes_seconds INT COMMENT 'The hours, minutes, and seconds part of the timestamp' # 修改字段注释 AFTER severity; # 修改字段位置 **增加列** ALTER TABLE log_messages ADD COLUMNS ( app_name STRING COMMENT 'Application name', session_id LONG COMMENT 'The current session id'); **删除或者替换列** ALTER TABLE log_messages REPLACE COLUMNS ( hour_mins_secs INT COMMENT 'hour, minutes, seconds from timestamp', severity STRING COMMENT 'The message severity' message STRING COMMENT 'The rest of the message'); # 未修改字段名,移除了之前所有字段并重新指定了新的字段 **修改列表属性** ALTER TABLE log_messages SET TBLPROPERTIES ( 'notes' = 'The process id is no longer captured; this column is always NULL'); **CH5 HiveQL的数据操作** 1.向管理表中装载数据 LOAD DATA LOCAL INPATH '${env:HOME}/california_employees' OVERWRITE INTO TABLE employees PARTITION (country = 'US', state = 'CA'); # 如果分区目录不存在的话,这个命令会先创建分区目录,然后在将数据拷贝到该目录下.如果目标表示非分区表,那么语句中应该省略PARTITION子句. 2.通过查询语句向表中插入数据 INSERT OVERWRITE TABLE employees PARTITION (country = 'US', state = 'OR') SELECT * FROM staged_employees se # 选取stage_employees(se)表的相应字段插入到employee之前的分区表中 WHERE se.cnty = 'US' AND se.st = 'OR'; # 查询 # 分区employees表![分区employees表][employees] 下面两个查询是等价的 hive> SELECT name, salary FROM employees; hive> SELECT name, salary FROM employees; hive> SELECT e.name, e.salary FROM employees e; # 表的别名 hive> SELECT name, deductions FROM employees; # deduction列是一个MAP,即键值对 ![在这里插入图片描述][20201223175825593.png] **如何引用集合数据类型中的元素** ![在这里插入图片描述][20201223180044520.png] ***subordinates是列表*** hive> SELECT name, deductions["State Taxes"] FROM employees; # deductions是MAP,相当于通过字典中的键来取值 ![在这里插入图片描述][20201223180340245.png] hive> SELECT name, address.city FROM employees; address是STRUCT数据类型, 引用STRUCT中的一个元素,可以用\*\*"."\*\*符号 (address.city) ![在这里插入图片描述][20201223180639310.png] **使用正则表达式来指定列** hive> SELECT symbol, 'price.*' FROM stocks; # 选取symbol列和所有列名义price作为前缀的列 ![在这里插入图片描述][20201223182134202.png] **使用列值进行计算** hive> SELECT upper(name), salary, deductions["Federal Taxes"], > round(salary * (1 - deductions["Federal Taxes"])) FROM employees; # 查询语句太长,所以分成了两行 ![在这里插入图片描述][20201223182631759.png] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70] … **聚合函数** hive> SELECT count(*), avg(salary) FROM employees; # 查询示例表employees中有多少雇员,以及计算平均薪资 4 77500.0 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 1] \*\* LIMIT语句\*\* LIMIT 2: 限制返回的行数 ![在这里插入图片描述][20201223183827711.png] **列别名** (as) ![在这里插入图片描述][20201223184032265.png] **嵌套SELECT语句** 对于嵌套查询语句来说,使用别名是非常有用的. ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 2] **CASE … WHEN … THEN 句式** 用于处理单个列的查询结果. ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 3] CASE … WHEN … THEN … 的查询结果是新列bracket的内容. \*\*\* WHERE语句\*\*\* (与AND和OR相连接) **SELECT语句用于选取字段,WHRER语句用于过滤条件** ![在这里插入图片描述][20201223190904403.png] **WHERE语句中不能使用列别名** **所以要使用一个嵌套的SELECT语句** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 4] \*\*LIKE 和 RLIKE *LIKE* hive> SELECT name, address.street FROM employees WHERE address.street LIKE '%Ave'; # 住址街道以Ave结尾的雇员 hive> SELECT name, address.city From employees WHERE address.city LIKE '%O'; # 住址城市以O开头的雇员 hive> SELECT name, address.street FROM employees WHERE address.street LIKE '%Chi%'; # 住址街道包含Chi ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 5] *RLIKE* ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 6] 或者: ![在这里插入图片描述][20201223220403428.png] **GROUP BY** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 7] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 8] **HAVING语句** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 9] 即HAVING子句通过一个简单的语法完成了原本需要通过子查询才能对GROUP BY语句产生的分组进行条件过滤的任务。 **如果没有HAVING子句,那么这个查询需要使用一个嵌套的SELECT子查询:** hive> SELECT s2.year, s2.avg FROM > (SELECT year(ymd) AS year, avg(price_close) AS avg FROM stocks > WHERE exchange = 'NASDAQ' AND symbol = 'AAPL' > GROUP BY year(ymd) s2 # s2是表别名 > WHERE s2.avg > 50.0 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 10] **JOIN 语句** (**Hive只支持等值连接**) select…from…left join(select…from…):先表连接再select字段 **INNER JOIN** 内连接 hive> SELECT a.ymd, a.price_close, b.price_close # 选取所需的三个字段 > FROM stocks a JOIN stocks b ON a.ymd = b.ymd # FROM(连接后的新表)WHERE (过滤条件) ON指定了两个表间数据进行连接的条件。 > WHERE a.symbol = 'APPl' and b.symbol ='IBM'; **先按ymd进行自连接(stock a stock b 是一个表),然后筛选出同一日期苹果和IBM的数据,最后SELECT所需的三个字段** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 11] **非自连接的等值内连接** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 12] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 13] **JOIN优化**![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 14] **LEFT OUTER JOIN** 左外连接 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 15] **笛卡尔积连接** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 16] **ORDER BY / SORT BY** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 17] **UNION ALL** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 18] ## 3、 greenplum基础(前三章) ## -------------------- # 学习产出: # 1、 hive编程前6章 重点第六章 2、 greenplum前三章 [employees]: /images/20221120/73735da3c650492fbfdbf507f357b486.png [20201223175825593.png]: /images/20221120/05e849c9616a4aa097e8b1c5ddec45e2.png [20201223180044520.png]: /images/20221120/aa4d61cb5f1d4faa9029da87ea865409.png [20201223180340245.png]: /images/20221120/5d1853d0f9ad4408a5d0bf981fcad4c1.png [20201223180639310.png]: /images/20221120/e5276af8088144c2a9d8f10b1ab01ece.png [20201223182134202.png]: /images/20221120/c71f6ceeaca64eb3889b51a4e028f04a.png [20201223182631759.png]: /images/20221120/c5dd8092b792412eb09889673bc8d2dc.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70]: https://img-blog.csdnimg.cn/20201223182853396.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg==,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 1]: https://img-blog.csdnimg.cn/20201223183312381.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg==,size_16,color_FFFFFF,t_70 [20201223183827711.png]: https://img-blog.csdnimg.cn/20201223183827711.png [20201223184032265.png]: https://img-blog.csdnimg.cn/20201223184032265.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 2]: https://img-blog.csdnimg.cn/20201223185011488.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg==,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 3]: https://img-blog.csdnimg.cn/20201223185653778.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg==,size_16,color_FFFFFF,t_70 [20201223190904403.png]: https://img-blog.csdnimg.cn/20201223190904403.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 4]: https://img-blog.csdnimg.cn/2020122319121918.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg==,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 5]: https://img-blog.csdnimg.cn/20201223215902582.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg==,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 6]: https://img-blog.csdnimg.cn/20201223220323864.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg==,size_16,color_FFFFFF,t_70 [20201223220403428.png]: https://img-blog.csdnimg.cn/20201223220403428.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 7]: https://img-blog.csdnimg.cn/20201223221325188.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg==,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 8]: https://img-blog.csdnimg.cn/2020122322135771.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg==,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 9]: https://img-blog.csdnimg.cn/20201223221531993.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg==,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 10]: https://img-blog.csdnimg.cn/20201223224052755.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg==,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 11]: https://img-blog.csdnimg.cn/20201223230921480.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg==,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 12]: https://img-blog.csdnimg.cn/2020122323180388.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg==,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 13]: https://img-blog.csdnimg.cn/20201223232118833.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg==,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 14]: https://img-blog.csdnimg.cn/20201223232351233.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg==,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 15]: https://img-blog.csdnimg.cn/20201223233520802.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg==,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 16]: https://img-blog.csdnimg.cn/20201224110632713.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg==,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 17]: https://img-blog.csdnimg.cn/20201224111958760.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg==,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg_size_16_color_FFFFFF_t_70 18]: https://img-blog.csdnimg.cn/20201227163810345.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjemRoYg==,size_16,color_FFFFFF,t_70
还没有评论,来说两句吧...