Spark-算子-Active

Spark开发问题解决(一):序列化报错 java.io.notSerializableException: org.apache.spark.SparkContext 序列化问题产生背景 在写Spark的应用时,经常会碰到序列化的问题。例如,在Driver端的程序中创建了一个对象,而在各个Executor中会用到这个对象 —— 由于Driver端代码与Executor端的代码运行在不同的JVM中,甚至在不同的节点上,因此必然要有相应的序列化机制来支撑数据实例在不同的JVM或者节点之间的传输。 一般来说这个问题的出现都是在map或者filter等算子中使用了外部的变量或者方法,但是这个变量或者方法本身不支持序列化,所以依然会导致整个类序列化时出现问题,最终导致出现tas 阅读详情

image.png

reduce

  /**
   * 算出总价
   * 注意点:
   * 1. 函数中的curr参数,并不是value,而是一整条数据
   * 2. reduce 整体上的结果,只有一个
   */
  @Test
  def reduce(): Unit = {
    val tuple: (String, Double) = sc.parallelize(Seq(("手机", 10.0), ("手机", 15.0), ("电脑", 20.0)))
      .reduce((curr, agg) => ("总价", curr._2 + agg._2))
    println(tuple)
  }

foreach

  @Test
  def foeach(): Unit = {
    sc.parallelize(Seq(1, 3, 2, 4, 5, 7, 6))
      .foreach(println(_))
  }

countAndCountByKey

  /**
   * count 和 countByKey 的结果相差很远,每次调用Action 都会生成一个job,job会运行获取结果
   * 所以两个job 会有大量的log,其实就是在运行 job
   *
   * countByKey 的运算结果是 Map(电脑 -> 1, 手机 -> 2)
   * 数据倾斜,如果要解决数据倾斜的问题,是不是要先知道谁倾斜,通过countByKey可以查看对应数据的总数,从而解决数据倾斜的问题
   */
  @Test
  def countAndCountByKey(): Unit = {
    println(sc.parallelize(Seq(("手机", 10.0), ("手机", 15.0), ("电脑", 20.0)))
      .count())
    println("================================== ")
    println(sc.parallelize(Seq(("手机", 10.0), ("手机", 15.0), ("电脑", 20.0)))
      .countByKey())
  }

take

  /**
   * take 和 takeSample都是获取数据,一个是 直接获取,一个是采样获取
   * frist 一般情况下,action会从所有分区获取数据,相对来说速度就比较慢,
   * frist 只是获取第一个元素,所以frist只会处理第一个分区,所以速度很快,无序处理所有数据
   */
  @Test
  def take(): Unit = {
    val rdd: RDD[Int] = sc.parallelize(Seq(1, 2, 3, 4, 5, 6))
    rdd.take(3).foreach(println(_))
    println(rdd.first())
    rdd.takeSample(withReplacement = true, num = 3).foreach(println(_))
  }
Spark军师之DAGScheduler        搬个凳子,捧着瓜子,让我们开始唠嗑。      首先,字面解读下“DAGScheduler”,可以理解为是一个DAG调度器,DAG又是啥呢?学术名叫:有向无环图。一个spark应用程序提交,spark引擎就是通过DAGScheduler将其切分成一个个stage。让我们先来看看DAGScheduler是在哪里起的作用的。经典图:    那这个DAGScheduler的职能到底是什么呢... 阅读详情

相关推荐

Spark Streaming 状态更新:updateStateByKey 实现跨批次累加统计(附检查点配置)

本文深入解析Spark Streaming中`updateStateByKey`算子的实现原理与应用场景,详细介绍如何通过状态更新函数实现跨批次累加统计,并重点讲解检查点配置的实践方法。文章包含完整的PySpark实战案例,涵盖套接字流处理、状态恢复机制以及生产环境优化策略,帮助开发者掌握实时流计算中的状态管理技术。

congju3179的博客 428

Spark - Logging 简单使用

使用 Spark 运行任务打日志经常遇到一个问题就是日志太多,除了自己的 print 日志之外,还有很多 Executor、client 的日志,一方面任务运行期间会占用更多的机器存储,其次也不方便查询自己的 print 日志。下面介绍下常用的日志系统与使用方法。......

BITDDD小栈 2005

Spark构建生产级用户流失预测Pipeline实战

用户流失预测是典型的业务驱动型机器学习任务,其核心不在算法本身,而在于特征工程的稳定性、标签定义的业务对齐性,以及端到端pipeline的可追溯与可重现能力。基于Spark DataFrame的全链路处理,能天然保障计算口径一致性、分区裁剪效率和Delta Lake版本管理能力;而pandas UDF结合LightGBM的推理架构,则在模型表达力与工程可控性之间取得关键平衡。该方案已广泛应用于电信、SaaS与金融行业,支撑千万级用户日更特征、百维以上业务可解释特征、Top-K Lift等可行动指标交付。本文

weixin_30701575的博客 373

大数据-Spark(二)

大数据-Spark(二) Spark集群安装部署 前置条件搭建好zookeeper集群 1.下载安装包 https://archive.apache.org/dist/spark/spark-2.3.3/spark-2.3.3-bin-hadoop2.7.tgz 2.规划安装目录 /kkb/install 3.上传安装包到服务器 4.解压安装包到指定的安装目录 tar -zxvf spark-2.3.3-bin-h...

海恋北斗星 375

大数据入门实战:从核心概念到Spark/Flink项目开发全解析

大数据技术是处理海量、高速、多样数据的关键技术体系,其核心在于通过分布式计算框架实现数据的存储、处理与分析。从经典的Hadoop MapReduce批处理模型,到以Apache Spark为代表的快速批处理与流处理一体化引擎,再到Apache Flink的流处理优先架构,技术演进始终围绕提升数据处理效率与实时性展开。这些技术为数据驱动决策、实时推荐、风险监控等场景提供了基础支撑。本文聚焦于大数据开发实践,通过一个完整的离线用户行为分析项目,详细演示了如何使用PySpark进行数据清洗、聚合与可视化分析,涵盖

weixin_33835103的博客 374

CMU的local_planner学习笔记

ros::Subscriber subOdometry = nh.subscribe//当接收到/state_estimation话题消息更新时启动odometryHandler回调函数 (消息格式:nav_msgs::Odometry消息内容:关于机器人或车辆的位置和方向(姿态)信息)pcl::PointCloud::Ptr freePaths(new pcl::PointCloud());

qq_35971623的博客 3877

【Spark】一起了解一下大数据必不可少的Spark吧!

目录Spark概述官网Spark是什么?特点Spark架构模块主要架构模块Spark CoreSpark SQLSpark StreamingMLlibGraghX集群管理器主要运行角色MasterWorkerExecutorTaskApplicationJobclientDriverSpark运行模式 Spark概述 官网 http://spark.apache.org/ Spark是什么? ...

关于我转生变成程序猿这档事 800

AutoCAD 2024 LISP实用技巧:自定义快捷命令与高效绘图工具集

本文详细介绍了如何在AutoCAD 2024中部署和使用LISP脚本,打造高效绘图工具集。通过自定义快捷命令,如WFF(超级文字查找替换)、GQT(图层隔离)和LLTJ(智能长度统计),可大幅简化图层管理、文字编辑和测量统计等重复性操作,显著提升绘图效率。

gan8painter的博客 318

Spark快速入门系列(6) | Spark环境搭建—standalone(3) 配置HA高可用模式

  大家好,我是不温卜火,是一名计算机学院大数据专业大二的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只有csdn这一个平台,博客主页:https://buwenbuhuo.blog.csdn.net/   此篇为大家带来的是Spark环境搭建—standalone(3).

不温卜火 5925

避开这5个坑!ADNI数据库下载实操经验分享(含断点续传方案)

本文分享了ADNI数据库下载的5个常见陷阱及解决方案,包括高级搜索策略优化、断点续传技巧和数据完整性验证。特别针对大文件下载中断问题,提供了wget断点续传和分卷下载的实操方法,帮助研究者高效获取神经影像数据,避免重复下载和时间浪费。

git9versioner的博客 373

基于CNN网络的轴承故障诊断

内容参考:《基于卷积神经网络的轴承故障 诊断算法研究》–张伟 代码参考: https://github.com/AaronCosmos/wdcnn_bearning_fault_diagnosis 1 背景: 基于信号处理的特征提取+分类器的传统智能诊断算法,对专家经验要求高,设计耗时且不能保证通用性,已经不能满足机械大数据的要求。提出使用基于卷积神经网络智能诊断算法来自动完成特征提取以及故障识别。 1.1 挑战 机电产品故障诊断面临的挑战,有三大特点: (1)数据量大,专业分析人员的数量严重不足,仅依靠人

weixin_45679938的博客 7万+

spark任务中有task一直处于active状态无法往下执行问题解决

spark任务阻塞

bale_的博客 1809

高通8155源码下载与Android源码编译

一.下载代码 高通下载源码位置: Qualcomm CreatePoint 注册账号,然后登入 可以先选择edit -> infotainment -> sa8155 -> favorites, 点击View TOC就可以过滤出sa8155所有的信息目录.如下图 拉取代码链接在ChipCode中,点击进去可以看到所有的基线版本,选择你需要下载的版本点进去,如sa8155p-la-1-0_ap_standard_oem,把高通专有代码和开源代码都下载到本机. 1..

Johnny2004的专栏 7675

Spark Transform算子和Action算子速查

前言 RDD是spark中最重要的抽象单位,所有的高级操作细化到底层,都是由RDD来完成的,RDD的操作有很多,但从计算的角度来划分,RDD可以分为转换算子和执行算子。 之前我们也讲到,RDD是惰性加载的,转换算子创建时并不会执行计算过程,只有当遇到执行算子时才会产生计算。本文就RDD的转换操作和执行操作作一个总结。 正文 首先创建执行环境和数据集 val conf: SparkConf = new SparkConf().setMaster("local").setAppName("test01"

qq_37163925的博客 554

RK3588平台开发系列讲解(以太网篇)MDIO底层驱动

沉淀、分享、成长,让自己和他人都能有所收获!😄。

内核笔记 6885

大疆司空 2 私有化部署:FH2、Terra、4G 三大服务区别详解

摘要: 司空2私有版包含三大模块:FH2(核心平台,必选)、Terra(建模算力,需NVIDIA显卡)、4G(内网图传)。FH2是基础,支持设备管理与任务调度;Terra适用于测绘建模场景,依赖GPU算力;4G模块保障复杂环境下的图传稳定性,适合纯内网部署。选择逻辑:先部署FH2,再按需添加Terra(需显卡)或4G(需内网支持),避免资源浪费。

2501_93651177的博客 579

RDD算子大全,动作算子(active,non-lazy),装换算子(transformation,lazy)

动作算子

qq_42448606的博客 1677

当启动容器的时候提示:exec format error?如何解决问题

Docker容器出现"exec format error"的主要原因是架构不兼容(如ARM设备运行x86镜像)。解决方案包括:1)匹配镜像与宿主机架构;2)构建时指定平台;3)安装QEMU模拟器;4)修复文件权限和格式;5)验证基础镜像兼容性。排查流程应从检查架构匹配开始,逐步验证权限、解释器和换行符等问题。建议优先使用多架构镜像,构建时明确指定平台,并使用buildx工具生成多平台镜像。调试时可进入容器手动验证文件格式和兼容性。

weixin_39291964的博客 2718

spark的checkpoint

========================================================================================================== 一.checkpoint 原理 http://spark.apache.org/docs/1.6.1/streaming-programming-guide.html#transfo

keyuquan的博客 1024

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Spark RDD部分算子应用案例

package Basic import org.apache.spark.{SparkConf, SparkContext} import scala.collection.mutable.ArrayBuffer /**   * Created by tg on 10/23/16.   */ object OperatorTest {   def main(args: Arra

大唐帝国—前营 1236

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Spark总结整理(一):Spark内核架构(Spark从启动到执行的流程)

本篇文章主要介绍Spark的内核架构,详细介绍从Saprk程序编写完成使用Spark submit(shell)的方式提交到完成任务的流程 Spark任务详解: 将编写的Spark程序打成 jar 包 调用 spark-submit 脚本提交任务到集群上运行 运行sparkSubmit的main方法,在这个方法中通过反射的方式创建我们编写的主类的实例对象,然后调用main方法,开始执...

super_wj0820的博客 566

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

大数据的那些事-spark streaming

      我们前边讲过spark streaming实际上一系列微批处理程序组成,与批处理不同的一个地方在于,流处理程序有时间的概念,这里指的时间是数据正式接入spark streaming程序的时间(系统时钟 System Clock)。           对spark RDD 而言,按触发spark job的算子执行顺序,spark 最终会形成两层调度器,第一层是高层DagSchedul...

weixin_40005188的博客 908

spark submit参数调优

在开发完Spark作业之后,就该为作业配置合适的资源了。Spark的资源参数,基本都可以在spark-submit命令中作为参数设置。很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何设置这些参数,最后就只能胡乱设置,甚至压根儿不设置。资源参数设置的不合理,可能会导致没有充分利用集群资源,作业运行会极其缓慢;或者设置的资源过大,队列没有足够的资源来提供,进而导致各种异常。总之,无论是哪...

影密卫 552

Spark Streaming — StreamingCongtext初始化及Receiver启动

StreamingContext初始化   StreamingContext在初始化的时候,会创建两个重要的组件DStreamGraph和JobScheduler,如下所示: // 这里初始化的一个重要的组件DStreamGraph, // 它里面保存了Spark Streaming Application中一系列的DStream的依赖关系,以及互相之间的算子的应用 private[...

zlx_code的专栏 398

Spark源码分析之作业和任务调度流程

一.前言 Spark的作业和任务调度系统是其核心。Spark的作业调度主要是基于RDD的一系列操作构成一个作业,然后在Executor上执行,这些操作算子主要分为转换和行动算子,对于转换算子的计算是lazy级别的,也就是延迟执行,只有出现了行动算子才触发作业的提交。在Spark调度中,最重要的是DAGScheduler和TaskSechduler两个调度器...

SmallCatBaby的博客 826

spark分区数,task数目,core数,worker节点个数,excutor数量梳理

转载自:https://www.cnblogs.com/hadoop-dev/p/6669232.html spark分区数,task数目,core数,worker节点个数,excutor数量梳理 作者:王燚光链接:https://www.zhihu.com/question/33270495/answer/93424104来源:知乎著作权归作者所有。商业转载请联系作者获得授...

weixin_30532973的博客 142
上一篇: SparkCore扩展-深入了解RDD
下一篇: RDD-缓存
.JWY.
博客等级 码龄11年 10粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值