HIVE Streaming小结

Flink1.11 streaming写入hive踩坑 1,踩坑的地方,可能是依赖冲突: 在开始执行代码的时候发现报错是缺少ORC的依赖,所以导致添加了部分依赖,导致程序执行结果跟预想不一样 2,不熟悉具体API导致 3,都是idea本地执行的代码,还没在集群测试。 POM文件,干净版本: <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-json</artifactId> &. 阅读详情

HIVE中的查询可以结合使用非java语言的脚本(比如shell、python、perl等),达到另一种处理数据的方式。

下面通过自己亲自实践的测试程序说明Streaming的常见用法:

(1)恒等变换
(2)改变类型
(3)投影变换
(4)操作转换
(5)使用分布式内存
(6)CLUSTER BY、DISTRIBUTE BY、SORT BY
(7)计算cogroup

Streaming

HIVE是通过利用或扩展Hadoop的组件功能来运行的,常见的抽象有InputFormat、OutputFormat、Mapper、Reducer,还包含一些自己的抽象接口,例如SerializerDeserializer(SerDe)、用户自定义函数(UDF)和StorageHandlers。

这些组件都是java组件,不过hive将这些复杂的底层实现隐藏起来了,而提供给用户通过SQL语句执行的方式,而不是使用java代码。

Streaming 提供了另一种处理数据的方式。在streaming job中,Hadoop StreamingAPI会为外部进程开启一个I/O管道。然后数据会被传给这个进程,然后数据从标准输入中读取数据,然后通过标准输出来写结果数据,最后返回到Streaming API  job。尽管HIVE并没有直接使用Hadoop的StreamingAPI,不过他们的工作方式是一致的。

这种管道计算模型对于Unix操作系统以及其衍生系统,如Linux和Mac OS  X的用户来说是非常熟悉的。

提示:

Streaming的执行效率通常会比对应的编写UDF或改写InputFormat对象的方式要低。管道中的序列化和反序列化数据通常是低效的。而且以通常的方式很难调试整个程序。不过,对于快速原型设计和支持非java编写的已有的代码是非常有用的。对于那些不想写java代码的HIVE用户来说,这也是一个高效的方式。

HIVE中提供了多个语法来使用Streaming,包括:MAP()、REDUCE()、TRANSFORM()。

需要注意的是,MAP()实际上并非可以强制在map阶段执行Streaming,同样REDUCE()实际上并非可以强制在reduce阶段执行Streaming,所以推荐使用TRANSFORM(),这样可以避免误导读者对查询语句产生疑惑。

对于我们的Streaming例子,将使用一个表名为a的小表,其中有两个字段,分别是col1和 col2,它们都是INT类型的,表中有2行数据:

hive> create table a (col1 int,col2 int)
    > row format delimited fields terminated by '\t';

hive> insert into a values (4,5);
hive> insert into a values (3,2);

(1)恒等变换

最基本的Streaming job就是恒等运算。/bin/cat 这个shell命令可以将传递它的数据直接输出,所以满足恒等运算。本例中,/bin/cat 这个shell假定已经安装到所有的TaskTracker节点了。实际上任意的Linux系统都会包含这个脚本的!稍后,我们将展示一些程序没有安装到集群中时,通过hive如何将这些程序“加载”到集群中。

hive> select transform (col1,col2)
    > using '/bin/cat' as newa,newb
    > from default.a;

注意:transform 的参数字段名必需和实际定义的一致,否则会报错:


正确执行结果:

(2)改变类型

TRANSFORM返回的字段的数据类型默认是字符串类型的。不过可以通过如下语法将类型转换为其他数据类型:

hive> select transform (col1,col2)
    > using '/bin/cat' as (newa int,newb double) from a;


(3)投影变换

Streaming中可以使用cut命令提取或者映射出特定的字段。换句话说,可以达到和select相同的效果:

hive> select transform (col1,col2)
    > using '/bin/cut -f1'
> as newa,newb from a;

可以注意到,上面的例子中,查询从外部处理过程中返回的只有一个字段,而实际期望的是两个字段,因此字段newb的值总是null。默认情况下,TRANSFORM需要两个字段,不过实际上可以为比其小的任意个字段:

hive> select transform (col1,col2)
    > using '/bin/cut -f1'
    > as newa from a;

(4)操作转换

/bin/sed 程序是一个 流编辑器,其可以接受输入数据流,然后按照用户的指定进行编辑,最后将编辑后的结果到输出数据流中。如下面的例子,将字符串“4”替换为字符串“10”:

hive> select transform (col1,col2)
    > using '/bin/sed s/4/10/'
    > as newa,newb from a;

(5)使用分布式内存

到目前为止所列举的Streaming例子都是UNIX系统或其衍生系统自带的如cat或sed这样的系统脚本程序。当一个查询所需要的文件没有在每个TaskTracker上事先安装好时,用户需要使用分布式缓存将数据或者程序传输到集群中,然后在job完成后会清理掉这些缓存的数据和文件。(Hadoop的分布式缓存可以对缓存内的文件按照LRU原则进行删除,因此并非是job一结束就立即删除)。

这个功能非常有用,因为在大规模集群上安装或者卸载大量的小组件会成为一件很有负担的事情。同时,缓存中会独立保存每个job的缓存文件,而不会相互干扰。

下面是一个将摄氏度转换为华氏温度的shell程序脚本:

#!/bin/bash

while read LINE
do
  res=$(echo "scale=2;((9/5) * $LINE ) + 32" | bc)
  echo $res
done

可以在本地测试脚本,脚本不会提示输入,输入100,然后按回车键,这时这个进程会通过标准输出打印出 212.00;输入拎一个值,会得到另一个相应的结果。用户可以持续的输入数值,也可以通过 Ctrl +D终止输入:


HIVE的ADD FILE功能可以将文件加入到分布式缓存中。而被增加的文件会被存储到每个task节点机器的当前工作目录下。这样可以使得transform task直接使用脚本而不用确定到哪里去找这些文件:

首先把本地脚本放到hive的根目录下(每个人的配置可能不同):

[root@localhost shell_test]# cp ctof.sh /root

然后可以直接使用“相对路径”的分布式文件执行脚本:

hive> add file ${env:HOME}/ctof.sh;

hive> select transform (col1)  using 'ctof.sh' as convert from a;

笔者在实际测试上面的例子中,遇到下面错误:


最后解决方案是,在根目录下(root)中,发现sh脚本没有可执行权限,所以增加+x可执行权限:

增加执行权限之后,测试程序可以正确运行。(下面的测试python脚本程序同理)

(6)CLUSTER BY、DISTRIBUTE BY、SORT BY

Hive提供了语法来控制数据是如何被分发和排序的。这些功能可以应用在大多数的查询中,不过在处理Streaming时显得特别有用。例如,具有相同键的数据需要分发到同一个处理节点中,或者数据需要按照指定的列或者指定函数进行排序。hive提供了多种方式来控制这种行为。

第一种控制方式就是cluster by 语句,其可以保证类似的数据可以分发到同一个reduce task中,而且保证数据是有序的。

为了演示cluster by的用法,我们使用一个特殊的例子:通过另一种方式来实现Word Count算法。现在,我们使用transform功能和2个python脚本,一个脚本用于将读取的每行内容分割为单词,另一个脚本用于接收字频数据流以及单词的中间计数值,然后对每个单词的次品求和汇总。

下面是第一个python脚本,其可以按照空格将每行内容分割为单词:

mapper.py(注意要增加可执行权限,同上面的ctof.sh文件)

import sys

for line in sys.stdin:
words = line.strip().split()
for word in words:
    print “%s\t1” %(word.lower())

这个脚本从通用模块sys中引入常见的函数,然后循环获取“标准输入流”中的每行数据,然后按照空格划分每行的单词,生成一个单词集words,然后遍历整个集合并输出每个单词和对应的词频。

在展示第二个脚本之前,我们边讨论下传递给这个脚本的数据。我们的transform  hive查询中,我们将对第一个脚本的输出词组使用cluster by 。这样可以将所有相同的单词分配到同一个组中,每行一对数据,每对的数据形式是单词\t次数:

word1	1
word1	1
word1	1
word1	1
…

因此第二个脚本会复杂些,因为其需要缓存当前处理的单词,以及迄今为止这个单词出现的次数。当处理下一个单词时,这个脚本需要输出上一个单词的频数,然后重置缓存。

 

下面是第二个脚本:

reducer.py(同样注意执行权限)

import sys
 
(last_key,last_count) = (None,0)
for line in sys.stdin:
(key,count) = line.strip().split(“\t”)
if last_key and last_key != key:
   print “%s\t%d” % (last_key,last_count)
   (last_key,last_count) = (key,int(count))
else:
    last_key = key
last_count += int(count) 
if last_key:
    print “%s\t%d” % (last_key,last_count)

不妨先看一下第一个脚本的执行结果:

hive  > select transform (line) using '${env:HOME}/mapper.py'
      > as word,count from docs;

执行完整的hive查询,并将结果存入word_count结果表中:


using语句指定了python脚本的绝对路径。

替代cluster by 的最方便的方式就是使用 distribute by 和sort by ,使用它们的常用场景是:用户希望将数据按照某个字段划分,然后按另一个字段排序。

实际上cluster by word等价于distribute by word sort by word asc。

如下面的程序就是按照降序排序:

from 
     (from docs
     select transform (line) using '${env:HOME}/mapper.py'
     as word,count
     distribute by word sort by word desc) wc
     insert overwrite table word_count
     select transform (wc.word,wc.count) using '${env:HOME}/reducer.py'
     as word ,count;

可以对比和cluster by word执行的结果。

world   1
word    2
hello   3
count   1

对比之前cluster by 的结果:

count   1
hello   3
word    2
world   1


使用cluster by 或者使用结合sort by 的distribute by是非常重要的,因为如果没有这些指示,hive可能无法合理的并行执行job,所有的数据可能都会分发到同一个reducer上,这样会导致整体job执行时间延长。

如果没有指定cluster by 或者使用结合sort by 的distribute by,那么最后的结果是不正确的:

from 
     (from docs
     select transform (line) using '${env:HOME}/mapper.py'
     as word,count
     ) wc
     insert overwrite table word_count
     select transform (wc.word,wc.count) using '${env:HOME}/reducer.py'
     as word ,count;

可以对比一下两者的查询日志信息:

对比日志信息可以发现,没有reduce过程。

通常情况下,使用Streaming是为了将非java代码结合到hive中。使用java编写Streaming也是可以的,Hive中包含了GenericMR API 来试图为Streaming提供类似于MapReduce API的接口。

(7)计算cogroup

在MapReduce程序中,经常会对多数据进行join连接处理,然后使用transform进行处理。使用union all和cluster by,我们可以实现cogroup by操作的常见效果。

假设我们有多个不同源的日志文件,它们具有相同的schema。我们希望将它们合并起来,然后通过一个reduce_script进行分析:(这仅是一个模板)

from(
from(
       from log1 o1
       select o1.id,o1.order_id ……
       union all
       from log2 o2
select o2.id,o2.order_id ……
) union_msg
select  union_msg.id, union_msg.order_di ….
cluster by union_msg.id
) map
insert overwrite table log_analysis
select transform(map.id,map.order_id…) using ‘reduce_script’
as (id,order_id …);




参考资料:《Hive编程指南》












spark streaming消费kafka的数据 并写入HDFS和直接写hive表 (scala版本) 首先我消费的kafka的数据的类型为json类型数据 话不多说直接上代码 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt. 阅读详情

相关推荐

数仓工具—Hive streaming(10)

streaming 提供了另一种处理数据的方式。在streaming job中,Hadoop StreamingAPI会为外部进程开启一个I/O管道。然后数据会被传给这个进程,然后数据从标准输入中读取数据,然后通过标准输出来写结果数据,最后返回到Streaming API job。尽管HIVE并没有直接使用Hadoop的StreamingAPI,不过他们的工作方式是一致的。这种管道计算模型对于Unix操作系统以及其衍生系统,如Linux和Mac OS X的用户来说是非常熟悉的。

5万+

hive java streaming_Hive Streaming

1.Hive Streaming介绍在前面我们看到了UDF、UDTF、UDAF的实现并不是很简单,而且还要求对Java比较熟悉,而Hive设计的初衷是方便那些非Java人员使用。因此,Hive提供了另一种数据处理方式——Streaming,这样就可以不需要编写Java代码了,其实Streaming处理方式可以支持很多语言。但是,Streaming的执行效率通常比对应编写的UDF或改写InputFo...

weixin_39572316的博客 242

streamsets精简版01

大数据迁移工具,可以让市面上几乎所有主流的数据库连接进行数据迁移,共3份压缩文件太大分批上传

HiveStreaming使用笔记

HiveStreaming使用笔记HiveStreaming作用HiveStreaming使用要求HiveStreaming API 使用补充说明 HiveStreaming作用 hive传统的数据导入方式是批量导入,HiveStreaming支持流式数据导入。比如说从kafka批量中连续不断的导入数据到hive表中,传统的导入方式难以胜任该需求。 HiveStreaming使用要求 Hive...

weixin_43172032的博客 2343

hive Hcatalog streaming API使用

hive streaming hive传统的数据导入采用批量导入的方式,这中数据导入难以满足实时性的要求。hive streaming提供了数据流式写入的API,这样外部数据可以连续不断的写入hive中。 必备条件 hive streaming 需要配合hive 事务表使用,表的数据存储格式式必须为 orc 在 hive-site.xml 中设置如下参数以支持hive事务表hive.txn.manager =org.apache.hadoop.hive.ql.lockmgr.DbTxnManager hive.compactor.initiator.on = true (See more im

Qt自带绘图与GDI+绘图方式比较_gdi+实时绘制qt(2)

2、GDI+是Windows操作系统中的图形设备接口,它提供了一套用于绘制图形的API,包括了图形渲染、图形变换、图形剪切、图形填充等功能,使开发者可以快速地开发出各种类型的图形应用程序。1、Qt是一个跨平台的C++应用程序框架,它提供了一套用于GUI编程的类库,包括了绘图、网络、XML、数据库、多线程等模块,使开发者可以快速地开发出高质量的跨平台应用程序。Qt提供了一套用于绘图的类库,包括了QPainter、QPen、QBrush等类,使开发者可以快速地进行图形绘制。

qq_17136213的博客 915

Hive之——Streaming

转载请注明出处:https://blog.youkuaiyun.com/l1028386804/article/details/88624013 Hive中提供了多个语法来使用streaming,包括:MAP()、REDUCE()和TRANSFORM()。要注释的是MAP()实际上并非可以强制在map阶段执行streaming,正如reduce并非可以强制在reduce阶段执行streaming。因为这个原...

冰河的专栏 1782

VoIP概述

VoIP统一通信与VoIPVoIP与传统电话比较VoIP各项产品设备的类型及应用 统一通信与VoIP 统一通信指的是把计算机与传统通信技术统一成一体的新通信模式,融合计算机网络与传统通信网络在一个网络平台上,实现电话、传真、数据传输、音视频会议、呼叫中心、即时通信等众多应用服务 VoIP又称IP电话或IP网络电话,是Voice Over IP的缩写,这种技术通过对语音信号进行编码数字化,压缩处理成压缩帧,然后转换成为IP数据包在TCP/IP网络上进行传输,从而达到了在IP网络上进行语音通信目的 VoIP与传

kaminao的博客 4357

Hive Streaming

1.Hive Streaming介绍 在前面我们看到了UDF、UDTF、UDAF的实现并不是很简单,而且还要求对Java比较熟悉,而Hive设计的初衷是方便那些非Java人员使用。因此,Hive提供了另一种数据处理方式——Streaming,这样就可以不需要编写Java代码了,其实Streaming处理方式可以支持很多语言。但是,Streaming的执行效率通常比对应编写的UDF或改写Input

GatsbyNewton 5260

CentOS 7环境下GLPI与OCS Inventory资产管理系统集成部署指南

本文详细介绍了在CentOS 7环境下,如何将GLPI与OCS Inventory两大开源工具进行集成部署,构建自动化资产管理系统。指南涵盖环境准备、核心服务安装、Web界面初始化、OCS插件配置及资产同步实战,帮助运维人员实现IT资产的自动发现、统一管理与可视化,大幅提升资产管理效率。

weixin_29274337的博客 326

esp32s3 spi camera gc6133调试

gc6133 spi只有master模式,同时需要esp32提供主时钟,需要有主时钟然后才能通过i2c进行初始化.测试了几种方式,记录如下。

hclydao的专栏 1563

Flink Sql on Zeppelin(6)——Hive Streaming

概述 Flink1.11 在上周二正式release了,在此之前我也给大家分享过了Flink1.11的一些新特性,然后和大家说过这一期会给大家单独说Flink X Hive 本来打算找点数据,然后做一期类似于实时数仓的内容,但是数据不太好找,加上时间、精力有限就简单和大家聊聊吧 在开始之前,大家参考一下Hive Integration,把flink 连接hive所需要的包放到lib目录下 Hive Streaming Sink 先看看官网是怎么描述Hive Streaming Sink的吧 SET

狄杰的博客 1944

短视频mssdk中get_token协议逆向与加密流程深度解析

本文深度解析了短视频mssdk中get_token协议的逆向分析与加密流程。通过抓包、Frida Hook、静态分析等手段,详细拆解了协议数据的Protobuf结构、设备信息采集来源,并重点剖析了其核心加密链路:zlib压缩、自定义TEA算法与AES-CBC加密,最终实现完整的协议模拟。

flower的专栏 555

Spark-Streaming+HDFS+Hive实战

本文介绍了一个实战示例,展示了如何使用Spark Streaming从GBIF接口获取数据并进行处理,然后将处理后的数据保存到HDFS文件系统,并在Hive中创建外部表映射。文章从需求说明开始,详细介绍了使用Spark Streaming、HDFS和Hive的背景知识。接着,文章提供了代码示例,展示了如何编写工具类、实体类和接收器类来实现数据处理和存储。最后,文章展示了如何使用Spark Streaming将数据保存到HDFS,并在Hive中创建外部表映射。

zcs2312852665的博客 1811

假新闻检测论文分享(17)CAFE(Cross-modal Ambiguity Learning for Multimodal Fake NewsDetection)

本文首先从信息论的角度对跨模态歧义性学习问题进行形式化描述,利用不同单模态特征之间的分布散度量化其歧义性;然后,提出了一种模糊度感知的多模态假新闻检测方法CAFE。CAFE通过自适应地聚合单模态特征和跨模态关联,即在跨模态歧义性较弱时依赖单模态特征,在跨模态歧义性较强时参考跨模态关联,从而提高假新闻检测精度。提出了跨模态歧义学习问题,这是多模态假新闻检测的一个关键挑战,并提出了一种基于KL散度的方法,通过估计其特征分布的散度来量化文本和图像之间的歧义。

weixin_41964296的博客 1724

YOLOv8【第十二章:数据增强与数据工程篇·第10节】主动学习(Active Learning):如何挑选最有价值的样本进行标注!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 508

Hive Python Streaming的原理及写法

在Hive中,需要实现Hive中的函数无法实现的功能时,就可以用Streaming来实现。其原理可以理解成:用HQL语句之外的语言,如Python、Shell来实现这些功能,同时配合HQL语句,以实现特殊的功能。 比如,我有一张不同网站访问的日志表,其中有两个列是url和ref,分别代表当前访问的网址和来源地址,我想要查看用户的来源,即看用户都是从那些网站跳到这些网站上去的,这里有些网站可能域名

三分地 4793

【ArcGIS风暴】Win10操作系统ArcGIS许可License无法启动的解决方法汇总(绝对成功!)

文章目录1. 关闭Windows Defender2. 关闭系统防火墙3. 删除迈克菲(McAfee)杀毒软件4. 在系统服务中启动 在安装ArcGIS软件时,最重要的一步是许可服务的正常启动,通常,由于各种各样的原因,ArcGIS许可管理器License Manager十有八九会无法启动,点N多次都没反应,如果许可服务不能如愿启动的话,即使Desktop安装成功,也是无法打开的。本文汇总了Win10操作系统之上ArcGIS安装过程中可能会导致服务无法启动的原因及解决办法。 ArcGIS安装参考教程:

智慧空间实验室 2万+

Spark Streaming 实时写入Hive

一、背景 公司Flume版本过低,使用Flume时有数据丢失问题,但是暂时不方便更新框架。所以使用Spark Streaming替代Flume实现入库Hive功能。 二、流程图 Created with Raphaël 2.2.0kafkaSpark StreamingETLhive 三、代码实现 pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"

soldiers_A的博客 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Hive函数与Streaming

Hive 允许用户编写自定义函数(UDF)来扩展其功能。以下是使用 Java 编写一个简单的自定义函数的步骤。自定义函数不仅限于简单的字符串操作,还可以实现更复杂的逻辑。例如,编写一个计算两点间距离的函数:java编译并打包后,可以在 Hive 中使用这个 UDF 来计算两点间的距离。Hive Streaming 允许用户实时将数据流式写入到 Hive 表中。这对于需要实时数据处理和分析的场景非常有用,如实时日志分析、实时监控等。

qq_69558236的博客 1190

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Flink x Zeppelin ,Hive Streaming 实战解析

Flink 1.11 正式发布已经三周了,其中最吸引我的特性就是 Hive Streaming。正巧 Zeppelin-0.9-preview2 也在前不久发布了,所以就写了一篇 Zep...

Ververica的博客 770

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

hive streaming java_hive Streaming

1.Hive Streaming介绍在前面我们看到了UDF、UDTF、UDAF的实现并不是很简单,而且还要求对Java比较熟悉,而Hive设计的初衷是方便那些非Java人员使用。因此,Hive提供了另一种数据处理方式——Streaming,这样就可以不需要编写Java代码了,其实Streaming处理方式可以支持很多语言。但是,Streaming的执行效率通常比对应编写的UDF或改写InputFo...

weixin_39886929的博客 211

hive streaming java_Streaming Data Ingest V2

Starting in release Hive 3.0.0,Streaming Data Ingest is deprecated and is replaced by newer V2 API (HIVE-19205).Hive Streaming APITraditionally adding new data into Hive requires gathering a large am...

weixin_29515393的博客 339

hive json解析_Flink x Zeppelin ,Hive Streaming 实战解析

Flink 1.11 正式发布已经三周了,其中最吸引我的特性就是 Hive Streaming。正巧 Zeppelin-0.9-preview2 也在前不久发布了,所以就写了一篇 Zeppelin 上的 Flink Hive Streaming 的实战解析。本文主要从以下几部分跟大家分享:Hive Streaming 的意义Checkpoint & Dependency写入 Ka...

weixin_39711721的博客 166
上一篇: 一个简单的UDF小程序(HIVE)
ITrue的天空
博客等级 码龄14年 4粉丝 5原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值