hive优化

hive优化总结 优化时,把hive sql当做map reduce程序来读,会有意想不到的惊喜。 理解hadoop的核心能力,是hive优化的根本。这是这一年来,项目组所有成员宝贵的经验总结。   长期观察hadoop处理数据的过程,有几个显著的特征: 1.不怕数据多,就怕数据倾斜。 2.对jobs数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联多次汇总,产生十几 阅读详情

#优化设计:
考虑点:
1.模型设计(分区表,桶表)
2.文件格式(按机房配置,和实际需求选择)
3.数据倾斜(主键的设计,null主键的转换,map端combiner,)
4.减少map的数量(输入前合并文件,输出合并文件)
5.并行job数(同步进行)
6.jvm重用(jvm的资源开销)
7.Hql语句(开启Fetch简单查询,减少job的数量)
8.推测执行
9.其他参数调节

##1.设置分区表

对于HIVE来说,利用分区来设计表总是必要的.分区提供了一种隔离数据和优化查询的遍历的方式,特别是面对日益增长的数据规模,设置符合逻辑的分区可以避免进行全表扫描,只需加载特定某些hdfs目录的数据文件.
设置分区时,需要考虑设置成分区的字段,按照时间分区一般而言是一个好的方案,其好处在于其实按照不同时间颗粒度来确定合适大小的数据积累量,随着时间的推移,分区数量的增长是匀称的,分区的大小也是均匀的,达观数据每日处理大量的用户日志,对于user_log来说,设置分区字段为天或者月是合理的,但是如果,以userid字段来建立动态分区,而userid的基数是非常大的,显然分区数目是会超过hive的默认设置而执行失败,如果相对userid进行hash,我们可以以userid进行分桶(bucket),根据userid 进行hash然后分发到桶中,相同hash值的userid会分发到同一个桶中,每个桶对应这一个单独的文件

桶表:
hive bucket 桶对于每一个表(table)或者分区,Hive可以进一步组织成桶。Hive也是针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。采用桶能够带来一些好处,比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。
hive中table可以拆分成partition,table和partition可以通过‘CLUSTERED BY ’进一步分bucket,bucket中的数据可以通过‘SORT BY’排序。

set hive.enforce.bucketing = true;

总结点:
1.优化查询,这是分区(月或者日)
2.设置分桶(在分区的进一步分化)
PS:设置桶的作用
1.方便抽样查询
2.相同列表的通的两个表,join数据加快

##2.避免小文件

虽然分区有利于隔离数据和查询,设置过多过细的分区也会带来瓶颈,主要是因为HDFS非常容易存储大数据文件,由于分区对应着HDFS的目录结构,当存在过多的分区时,意味着文件的数目就越多,过多增长的小文件会给namenode带来巨大的性能压力,同时小文件过多会影响job的执行,hadoop会将一个job转换成多个task,即使对于每个小文件也需要要一个task去单独处理,task作为一个独立的jvm实例,其开启和停止的开销可能会大大超过实际的任务处理时间,因此,hive表设计分区不应该过多过细,每个目录下的文件足够大,应该是文件系统中块大小的若干倍

总结点:

1.影响namenode性能压力(元信息管理)
2.一个文件>一个map>一个task>一个jvm

处理方案:

1. jvm重用

小文件多或task多的业务场景
    set mapred.job.reuse.jvm.num.task=10  
    --开启10个task(jvm一直开着,应用场景,小文件,避免启动时间)

2.执行任务前合并小文件

Map合并小文件:

 set mapred.max.split.size=256000000 
  #每个Map最大输入大小(单位:字节)  
 set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat  
 #执行Map前进行小文件合并
  

输出合并(防止生成小文件):
 set hive.merge.mapfiles= true                 
 #在Map-only的任务结束时合并小文件  
 sethive.merge.mapredfiles= true               
 #在Map-Reduce的任务结束时合并小文件  
 set hive.merge.size.per.task= 256*1000*1000   
 #合并文件的大小  
 set hive.merge.smallfiles.avgsize=16000000     
 #当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge  

##3 选择文件格式

1.textfile

 textfile为默认格式
 存储方式:行存储
 优点,加载数据快(查询快)
 缺点:磁盘开销大,数据解析开销大
 压缩的text文件hive无法进行合并和拆分

2.sequencefile

二进制文件,以<key,value>的形式序列化到文件中
存储方式:行存储
优点:可分割,压缩,一般选择block压缩,查询中
缺点:存储空间最大,

3.rcfile(不用看)

存储方式:数据按行分块,每块按照列存储
压缩快,快速列存储
读记录尽量涉及到block最少
读取需要的列只需要读取每个row group的头部定义
读取全量数据的操作,性能比sequencefile没有明显的优势

4.orc(效率比rcfile高,是rcfile的改良版)

存储方式,数据按行分块,每块按照列存储
优点:压缩快,快速列存储,查询效率最高,列存储,避免扫描不必要的列读取
缺点:需要通过textfile文件转化

总结点:

TextFile: 好处,直接使用,加载数据快,坏处,磁盘开销大(无所顾忌)
orc: 好处,节省空间(存储空间是testfile的1/5),加载数据块,需要转换
text,seqfile能不用就尽量不要用  最好是选择orc

##4 group by 语句

ps:group by (id),有多少个id,就生成相应数量的reduce个数

案列分析:
对user_read_log表按userid group by 语句来继续探讨数据倾斜问题,首先我们explain group by 语句:
explain select userid,count(*) from user_read_log group by userid
Group By 的执行计划按照userid的hash值分发记录,同时在map端也做了本地reduce,groupby的shuffle 过程是按照hash(userid)来分发的,实际应用中日志中很多用户都是未注册用户或者未登陆,userid 字段为空的记录数远远大于userid不为空的记录数,当所有的空userid记录都分发到特定某一个reducer,对于groupby造成的数据倾斜问题,我们可以通过设置参数

  1. set hive.map.aggr=true (开启map端combiner);  
  2. set hive.groupby.skewindata=true(map端的key值随机分发); 

这个参数的作用是做reduce操作的时候,拿到的key并不是所有相同值的同一个reduce,而是随机分发,然后reduce做聚合,做完之后再做一轮MR,拿前面聚合过的数据再计算结果,虽然多了一轮MR任务,但是可以有效的见识数据倾斜问题可能带来的危险

ps:
1.每个文件至少产生一个map(按默认值128m算)
2.130m则产生两个map
3.combiner,(同机器上)map端做MR,然后再(不同机器上)reduce(多个机器上的map)

##5.Hive解决数据倾斜

正确的设置hive的参数可以在某种程度上避免数据倾斜问题,合适的查询语句,也可以避免数据倾斜问题,要尽早的过滤数据和裁剪数据,减少后续处理的数据量,是的join key 的数据分布较为均匀,将空字段随机赋予值,这样既可以均匀分发倾斜的数据

select userid,name from userid_info a
join (
select case when userid is null then cast(rand(47)*100000 as int)
else userid
from user_read_log
) b on (a.userid = b.userid)

select userid,name from userid_info a
join (
select userid
from user_read_log
where userid is not null
) b on (a.userid = b.userid)

##6.开启并发执行
同一个sql中的不同的job是否可以同时运行,提高作业的并发
set hive.exec.parallel=true
set hive.exec.parallel.thread.number = 32 (默认是8)

##零碎点:

  1. 将大表放后头,小表在前
    join连接时的优化:当多个表进行查询时,从左到右表的大小顺序应该是从小到大。原因:hive在对每行记录操作时会把其他表先缓存起来,直到扫描最后的表进行计算

  2. 使用相同的连接键( 减少job数)
    当对3个或者更多个表进行join连接时,如果每个on子句都使用相同的连接键的话,那么只会产生一个MapReduce job。

  3. 尽量尽早地过滤数据
    减少每个阶段的数据量,对于分区表要加分区,同时只选择需要使用到的字段。

select ... from 
A
join B
on A.key = B.key
where A.userid>10  
and B.userid<10
and A.dt='20120417'
and B.dt='20120417';

应该改写为:
select .... from 
(select .... from A where dt='201200417' and userid>10) a 
join ( select .... from B where dt='201200417'and userid < 10 ) b
on a.key = b.key;

4.order by & sort by (应避免排序操作)
sort by : 局部排序,并非全局有序,提高效率。
order by : 对查询结果进行全局排序,消耗时间长。

使用distribute by + sort by代替 order by

select * from baidu_click order by click desc;
select * from baidu_click distribute by product_line sort by click desc;

distribute by + sort by就是该替代方案,被distribute by设定的字段为KEY,数据会被HASH分发到不同的reducer机器上,然后sort by会对同一个reducer机器上的每组数据进行局部排序。

5.数据倾斜时负载均衡,当选项设定为true
set hive.map.aggr=true
set hive.groupby.mapaggr.checkinterval=1000000(用于设定map端进行聚合操作的条目数)
set hive.groupby.skewindata=true(map端key值随机分发)

有数据倾斜时进行负载均衡
  此处需要设定 hive.groupby.skewindata,当选项设定为 true 是,生成的查询计划有两个MapReduce 任务。
    在第一个 MapReduce 中,map 的输出结果集合会随机分布到 reduce 中, 每个reduce 做部分聚合操作,并输出结果。这样处理的结果是,相同的 Group By Key 有可能分发到不同的 reduce 中,从而达到负载均衡的目的;
    第二个 MapReduce 任务再根据预处 理的数据结果按照 Group By Key 分布到 reduce 中(这个过程可以保证相同的 Group By Key 分布到同一个 reduce 中),最后完成最终的聚合操作。

6.尽量避免执行MapReduce,简单查询(*,limit)直接通过Fetch task获取数据
ps:
1.set hive.fetch.task.conversion=more开启了Fetch任务 2.默认开启,在hiverc中设置初始化使用 3.在hive-site.xml中配置 <name>hive.fetch.task.conversion</name> <value>more</value>

##7.推测执行
(1)修改$HADOOP_HOME/conf/mapred-site.xml 文件

<property>

    <name>mapred.map.tasks.speculative.execution </name>

    <value>true</value>

</property>

<property>

    <name>mapred.reduce.tasks.speculative.execution </name>

    <value>true</value>

</property>

(2)修改hive 配置

set hive.mapred.reduce.tasks.speculative.execution=true;

##9.其他参数调节

9.1 USE VECTORIZATION
矢量查询(Vectorized query) 每次处理数据时会将1024行数据组成一个batch进行处理,而不是一行一行进行处理,这样能够显著提高执行速度。
可以通过设置

set hive.vectorized.execution.enabled = true;
set hive.vectorized.execution.reduce.enabled = true;

9.2 USE ORCFILE
ORCfile 使用了predicate push-down, compression等多种技术。Hive使用 ORCfile 作为表结构不仅可以节省存储空间,而且能够快速提高Hive Query的速度。

CREATE TABLE A_ORC (
    customerID int, 
    name string, 
    age int, 
    address string
) STORED AS ORC tblproperties (“orc.compress" = “SNAPPY”);

9.3 提交到任务队列

set mapreduce.job.queuename=root.online;
【大数据Hive】hive 优化策略之job任务优化 hive job优化策略 阅读详情

相关推荐

Hive性能优化总结

查找性能低下的原因;分析性能低下的根源;从配置及程序角度进行优化。

TDH计算引擎针对数据倾斜现象的保护机制

Shuffle Write阶段当出现数据倾斜时将出现Bucket size is too large (>2G) after compress的报错提醒,此时应当调整reduce number或者调整分桶策略;

andarly的专栏 1517

墨水屏高效开发:架构、开源库与实战优化指南

嵌入式显示技术中,电子墨水屏以其类纸观感和超低功耗特性,在电子书阅读器、智能办公本及工业仪表等场景中占据独特地位。其工作原理基于微胶囊电泳技术,仅在画面刷新时消耗电能,静态显示时功耗近乎为零,这带来了极致的续航优势。为实现流畅的交互体验,开发者需构建分层渲染架构,通过硬件抽象层统一驱动接口,并引入帧缓冲与差异比较算法智能决策局部刷新区域,从而大幅降低刷新延迟与功耗。开源库如GxEPD2和LVGL为墨水屏适配提供了关键支持,结合波形文件管理与电源优化策略,能有效解决残影与卡顿问题。本文聚焦于eink墨水屏高效

weixin_42545636的博客 411

Hive优化(21种方案)

1、Fetch抓取   Fetch抓取是指,Hive中对某些情况的查询可以不必使用MapReduce计算。例如:SELECT * FROM employees;在这种情况下,Hive可以简单地读取employee对应的存储目录下的文件,然后输出查询结果到控制台。   在hive-default.xml.template文件中hive.fetch.task.conversion默认是more,老版本...

小道的博客 6073

01_MySQL下载、安装与配置(以MySQL8.0.31版本为例)

1.点击下载好的mysql安装包 进入到mysql installer界面。2.选择MySQL Servers选项 一直下拉。

4819

UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 0-4: ordinal not in range(128)

python3报错处理:UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-4: ordinal not in range(128) 一、报错场景 // 报错代码 Traceback (most recent call last): File "test_autoo3_2.py", line 214, in <module> main() File "test_autoo3_2.py",

浪里小飞侠的博客 4201

Hive分桶表性能测试

环境说明: 1、源表:orc格式 按照天、小时分区 2、目标表(分桶表)按天分区 数据源来源于源表使用insert into select写入 3、一天的数据量约1.7亿+ 4、查询时使用spark thriftserver 资源非固定 目的:测试Hive分桶表的在大数据量下的查询性能 当前spark2.4.0版本不支持spark写入桶表https://issues.apache.org/jira/browse/SPARK-19256 1、样本数据:1天 桶表(SQL) ...

欲望以提升热忱 毅力以磨平高山 917

Linux命令行入门:从零掌握服务器运维与Shell脚本基础

在信息化时代,操作系统是数字世界的基石,而终端命令行则是高效驾驭服务器的核心技能。无论是软件部署、服务监控还是故障排查,掌握基于Shell的指令操作都能大幅提升工程效率。从最基础的文件目录管理、文本处理,到权限控制、进程监控与网络调试,命令行提供了一套强大且可自动化的操作范式。尤其对于运维工程师和开发者而言,理解管道、重定向以及脚本化任务,意味着将重复劳动转化为可复用的自动化流程。本文从环境准备讲起,系统梳理常用Linux命令的实际场景与输出验证,并延伸至Shell脚本编写与定时任务,帮助初学者快速建立从操

weixin_30522983的博客 255

问题记录:在hdfs上发现hive表数据的块大小变成了256M

直接上问题,发现有的表的块大小是256M,有的是128M,但是hdfs上并没有设置这个,就使用的默认的128M,那为啥变成了256M呢? +----------------------------------------------------+ | createtab_stmt | +----------------------------------------------------+ | CREATE TABLE `qzw_m

weixin_46034893的博客 915

从零开始:如何在STM32上搭建QP框架实现事件驱动开发(附完整代码)

本文详细介绍了如何在STM32嵌入式平台上从零开始搭建QP框架,实现事件驱动开发。通过对比传统前后台系统与RTOS的局限,深入剖析了QP框架基于活动对象和层次式状态机的核心优势,并提供了完整的环境配置、代码移植及一个智能灯光控制器的实战案例,帮助开发者构建清晰、可维护的复杂嵌入式应用。

weixin_29200741的博客 487

ADRV9009的学习历程(一)

** AD9361的同胞ADRV9009 ** 终于记录一下了 距离第一次想写博客记录自己学习的点点滴滴,大概已经过去有一年有余。一直都是停留在心有余而力不足的境界。 基本每次做项目遇到问题都会来优快云寻求帮助,这里虽离庙堂较远,但高手云集。每每读来,思绪万千,次次膜拜。 趁这次又学习了一样新物件,就记录一下,望大神看见能赐教一下。 ADRV9009 最近有项目要用到ADRV9009这个芯片。就来学习一下。做过AD9361的都知道,ADI官方会给出这个芯片的参考手册、数据手册和驱动程序。当然我只是见过AD

weixin_42868560的博客 1万+

hive 分桶文件的大小多大最合适

另一方面,如果某个列包含许多唯一值,例如包含顾客 ID 的列,这可能不是一个好的分桶字段,因为这可能会导致分桶数量过多,从而降低查询效率。在 Hive 中,选择分桶字段时,考虑到分桶字段的值将被用于对数据进行分区,因此选择较少离散值的列作为分桶字段可以提高查询效率。同时,指定适当的分桶数也很重要,应该进行实验和测试以找到最佳的分桶数,以获得最佳的查询性能。在 Hive 中,修改分桶字段比较困难,因为分桶字段决定了表的数据分布方式,如果修改分桶字段可能会导致数据重新分布,进而影响查询性能。

m0_38109926的博客 2722

Linux ARM平台开发系列讲解(调试篇) 1.6.4 NVIDIA AGX Xavier以太网MAC TO MAC模式

内核发展了那么多年,早已经将这种场景集成到了内核里,具体添加方式如下,本次针对。具体详细描述,可参考本专栏的网络篇和交换机篇,这里就简单的提一句,想要使用。速率和双工状态固定死,使其和交换机的模式一模一样,双方就可以建立通信了。2. MAC TO MAC原理。3. 开启无PHY模式进入内核。模式,本章节记录调试过程。模式,简单来说就是字面意思,以太网部分需要与交换机。,其他芯片也是一样的。修改设备树文件,将与。

DSMGUOGUO的博客 1530

Hive优化

1. 概述 1.1 hive的特征: 可以通过SQL轻松访问数据的工具,从而实现数据仓库任务,如提取/转换/加载(ETL),报告和数据分析; 它可以使已经存储的数据结构化; 可以直接访问存储在Apache HDFS或其他数据存储系统(如Apache HBase)中的文件; Hive除了支持MapReduce计算引擎,还支持Spark和Tez这两种分布式计算引擎; 它提供类似sql的查询语句HiveQL对数据进行分析处理; 数据的存储格式有多种,比如数据源是二进制格式,普通文本格式等等; 1.2

m0_61607827的博客 4409

基于CNN-LSTM融合模型的环卫车动态称重算法研究:从频率感知到精准质量估计

摘要: 针对环卫车辆动态称重需求,本研究提出一种基于CNN-LSTM融合网络的频率分析方法。通过在实验室构建振动频率采集系统,获取不同载重下的结构响应数据,经MATLAB进行信号处理和特征提取后,建立频率-质量的非线性映射模型。实验表明,该算法在静态和模拟动态场景下平均绝对误差小于1.5%,显著优于传统方法,为环卫车智能化管理提供了高精度实时称重方案。 关键词: 动态称重;深度学习;频率分析;CNN-LSTM;MATLAB。

AI的内部世界的博客 374

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Hive优化总结

一、SQL本身的优化 1、只select需要的列,避免select * 2、where条件写在子查询中,先过滤再关联 3、关联条件写在on中,而不是where中 4、数据量大时,用group by代替count distinct 5、数据量小时,用in代替join 6、避免笛卡尔积 7、join时大表放后面,使用相同的连接键 7、严格格式 Hive.mapred.mode,分 nonstrict,strict,默认是nonstrict, 如果设置为strict,对三种情况限制: (1)分区表必须加分区。

GodxvA 9060

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

hive 优化

hive 优化

qq_43192537的博客 3006

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Hive总结篇及Hive的优化

概述 Hive学习也有一段时间了,今天来对Hive进行一个总结,也是对自己的总结,作者还是个小白,有不对的地方请大家指出相互学习,共同进步。今天来谈一谈什么是Hive,产生背景,优势等一系列问题。 什么是Hive 老规矩:官网地址 Hive wiki. 先来谈谈自己的理解: 有些人可能会说Hive不就是写SQL的吗,那我们其实可以从另一个角度来理解:Hive很强大,只要写SQL就能解...

4万+

hive的优化策略

以 on,where 多条件字段顺序,建【多重】分区表,默认开启支持,以分区字段为条件筛选数据,tez引擎:动态分区剪裁支持。控制Mapper和Reducer数量,mapper的启动和初始化开销较大,【数量过多】导致开销大于逻辑处理,浪费资源。从表:不存在以NULL填充,where不能下推,on可以下推。主表:全部显示, on条件不能下推,where可以下推。配置压缩格式,表存储格式,查看是否支持压缩,是否支持切片。【连接键】的值分布不均:值集中的少数分区,其他分区没有值。分桶=>拉链表(分桶表)、抽样。

inori1256的博客 2563

Hive优化方法汇总

1、Fetch抓取 Fetch 抓取是指,Hive 中对某些情况的查询可以不必使用 MapReduce 计算。例如:SELECT * FROM employees;在这种情况下,Hive 可以简单地读取 employee 对应的存储目录下的文件,然后输出查询结果到控制台。 在 hive-default.xml.template 文件中 hive.fetch.task.conversion 默认是 more,老版本 hive 默认是 minimal,该属性修改为 more 以后,在全局查找、字段查找、limi

南洲.的博客 4854

hive部分:hive的优化,MapReduce的优化

hive 核心思想: 把 Hive SQL 当做 Mapreduce 程序去优化。 以下 SQL 不会转为 Mapreduce 来执行: select 仅查询本表字段; where 仅对本表字段做条件过滤。 explain 命令可以显示执行计划: EXPLAIN [EXTENDED] query; EXTENDED 可以看到更详细 的信息。 本地模式提高执行效率 本地模式: map...

wyqwilliam的博客 2695

Hive之——Hive SQL优化

一、Hive优化目标在有限的资源下,提高执行效率二、Hive执行HQL——&gt; Job——&gt; Map/Reduce三、执行计划查看执行计划explain [extended] hql四、Hive表优化1、分区静态分区动态分区set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstric...

冰河的专栏 2万+

hive中groupby优化_关于Hive优化的四种方法总结

一、整体架构优化现在hive的整体框架如下,计算引擎不仅仅支持Map/Reduce,并且还支持Tez、Spark等。根据不同的计算引擎又可以使用不同的资源调度和存储系统. 整体架构优化点:1、根据不同业务需求进行日期分区,并执行类型动态分区。 相关参数设置: 0.14中默认hive.exec.dynamic.partition=ture2、为了减少磁盘存储空间以及I/O次数,对数据进行压缩相关参数...

weixin_32154667的博客 2320

Hive之任务优化

Hive 是一个基于 Hadoop 的数据仓库工具,提供了 SQL-like 的查询语言来分析存储在 HDFS(Hadoop Distributed File System)上的大规模数据集。为了提高查询性能,Hive 提供了多种优化方法,涵盖不同层次的改进,从 SQL 查询层到执行层。

youziguo的专栏 1415

【hive】limit查询优化

limit不优化会全部查询后,再返回部分 优化后:对数据源抽样返回 开启优化参数: hive.limit.optimize.enable=true //开启对数据源进行采样的功能 hive.limit.row.max.size=100000 //设置最小采样容量。默认10万 hive.limit.optimize.file=10 //可抽样的最大文件数。默认10个 缺点:可能输入中有用的数据永远都不会被抽样到。 (1)配置文件 Hive 的配置文件包括:   A. 用...

开发随笔-猫咪酱 2751

hive执行语句优化

一、类SQL语句优化 1、跟SQL基本一致的优化原则 1.1 尽量原子化操作 尽量避免一个SQL包含复杂逻辑,可以使用中间表来完成复杂的逻辑。 1.2 尽量尽早地过滤数据 尽量先where筛选后再join,减少每个阶段的数据量,对于分区表要加分区条件,只选择需要使用到的字段。 1.3 表链接时尽量使用相同的连接键 当对3个或者更多个表进行join连接时,如果每个on子...

abc200941410128的博客 4583
上一篇: Storm容错机制
下一篇: mysql中join使用on、where范围
yjgithub
博客等级 码龄11年 53粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值