HBase之JavaAPI

本文详细探讨了如何使用HBase的Java API进行数据操作,包括连接HBase集群、创建表、插入数据、查询与扫描等关键步骤。通过实例代码,深入理解HBase的API用法及其在大数据存储中的作用。
摘要由CSDN通过智能技术生成
package com.czxy.demo01;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.util.ArrayList;

import static org.apache.hadoop.hbase.filter.CompareFilter.CompareOp.EQUAL;
import static org.apache.hadoop.hbase.filter.CompareFilter.CompareOp.LESS;

public class HBaseAPI2 {

    static Configuration configuration = new Configuration();

    /**
     * 删除表
     * 删除表需要管理员权限,先获取管理员权限,再将表的状态设置为disable
     * 先修改状态,再删除,若顺序不正确,也无法删除,因为代码的执行顺序是从上到下
     * @throws IOException
     */
    @Test
    public void deleteTable() throws IOException {
        //获取连接:Zookeeper
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        //获取要操作的表
        Table myuser2 = connection.getTable(TableName.valueOf("staff"));
        //获取管理员
        Admin admin = connection.getAdmin();
        //将表的状态设置为disable
        admin.disableTable(TableName.valueOf("staff"));
        //使用管理员权限删除表
        admin.deleteTable(TableName.valueOf("staff"));
        //关闭连接
        admin.close();
        myuser2.close();
        connection.close();
    }

    /**
     * 根据rowkey删除数据
     * @throws IOException
     */
    @Test
    public void deleteDataByRowKey() throws IOException {
        //
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Table myuser2 = connection.getTable(TableName.valueOf("myuser2"));
        Delete delete=new Delete("001".getBytes());
        myuser2.delete(delete);
        myuser2.close();
        connection.close();
    }

    /**
     * 多过滤器综合查询FilterList
     * 需求:使用SingleColumnValueFilter查询f1列族,name为刘备的数据,并且同时满足rowkey的前缀以00开头的数据(PrefixFilter)
     * @throws IOException
     */
    @Test
    public void  manyFilter() throws IOException {
        //获取连接
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Table myuser2 = connection.getTable(TableName.valueOf("myuser2"));
        Scan scan=new Scan();
        FilterList filterList = new FilterList();
        SingleColumnValueFilter singleColumnValueFilter=new SingleColumnValueFilter("f1".getBytes(), "name".getBytes(), EQUAL, "刘备".getBytes());
        PrefixFilter prefixFilter=new PrefixFilter("00".getBytes());
        filterList.addFilter(singleColumnValueFilter);
        filterList.addFilter(prefixFilter);
        scan.setFilter(filterList);
        ResultScanner scanner = myuser2.getScanner(scan);
        for (Result result : scanner) {
                //获取rowkey
                System.out.println(Bytes.toString(result.getRow()));
                //指定列族以及列打印列当中的数据出来
                // System.out.println(Bytes.toInt(result.getValue("f1".getBytes(), "id".getBytes())));
                System.out.println(Bytes.toString(result.getValue("f1".getBytes(), "name".getBytes())));
                //System.out.println(Bytes.toString(result.getValue("f2".getBytes(), "phone".getBytes())));
        }
        myuser2.close();
        connection.close();
    }

    /**
     * rowkey前缀过滤器PrefixFilter
     * 查询以00开头的所有前缀的rowkey
     * @throws IOException
     */
    @Test
    public void preFixFilter() throws IOException {
        //获取连接
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Table myuser2 = connection.getTable(TableName.valueOf("myuser2"));
        Scan scan=new Scan();
        PrefixFilter prefixFilter=new PrefixFilter("000".getBytes());
        scan.setFilter(prefixFilter);
        ResultScanner scanner = myuser2.getScanner(scan);
        for (Result result : scanner) {
            System.out.println(Bytes.toString(result.getRow()));
            System.out.println(Bytes.toInt(result.getValue("f1".getBytes(), "id".getBytes())));
            System.out.println(Bytes.toString(result.getValue("f1".getBytes(), "name".getBytes())));
            System.out.println(Bytes.toString(result.getValue("f2".getBytes(), "phone".getBytes())));
        }
        myuser2.close();
        connection.close();
    }


    /**
     * 列值排除过滤器SingleColumnValueExcludeFilter
     * @throws IOException
     */
    @Test
    public void singleColumnValueExcludeFilter() throws IOException {
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Table myuser2 = connection.getTable(TableName.valueOf("myuser2"));
        Scan scan=new Scan();
        SingleColumnValueExcludeFilter singleColumnValueExcludeFilter=new SingleColumnValueExcludeFilter("f1".getBytes(), "name".getBytes(), EQUAL, "刘备".getBytes());
        scan.setFilter(singleColumnValueExcludeFilter);
        ResultScanner scanner = myuser2.getScanner(scan);
        for (Result result : scanner) {
            System.out.println(Bytes.toString(result.getRow()));
            System.out.println(Bytes.toInt(result.getValue("f1".getBytes(), "id".getBytes())));
            System.out.println(Bytes.toString(result.getValue("f1".getBytes(), "name".getBytes())));
            System.out.println(Bytes.toString(result.getValue("f2".getBytes(), "phone".getBytes())));
        }
        myuser2.close();
        connection.close();
    }

    /**
     * 单列值过滤器 SingleColumnValueFilter
     *
     * @throws IOException
     */
    @Test
    public void singleColumnFilter() throws IOException {
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Table myuser2 = connection.getTable(TableName.valueOf("myuser2"));
        Scan scan = new Scan();
        SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("f1".getBytes(), "name".getBytes(), EQUAL, "刘备".getBytes());
        scan.setFilter(singleColumnValueFilter);
        ResultScanner scanner = myuser2.getScanner(scan);
        for (Result result : scanner) {
            System.out.println(Bytes.toString(result.getRow()));
            System.out.println(Bytes.toInt(result.getValue("f1".getBytes(), "id".getBytes())));
            System.out.println(Bytes.toString(result.getValue("f1".getBytes(), "name".getBytes())));
            System.out.println(Bytes.toString(result.getValue("f2".getBytes(), "phone".getBytes())));
        }
        myuser2.close();
        connection.close();
    }


    /**
     * 列值过滤器Filter
     * 查询所有列当中包含8的数据
     *
     * @throws IOException
     */
    @Test
    public void valueFilter() throws IOException {
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Table myuser2 = connection.getTable(TableName.valueOf("myuser2"));
        Scan scan = new Scan();
        ValueFilter valueFilter = new ValueFilter(EQUAL, new SubstringComparator("8"));
        scan.setFilter(valueFilter);
        ResultScanner scanner = myuser2.getScanner(scan);
        for (Result result : scanner) {
            System.out.println(Bytes.toString(result.getRow()));
            //指定列族以及列打印列当中的数据出来
            System.out.println(Bytes.toString(result.getValue("f2".getBytes(), "phone".getBytes())));
        }
        myuser2.close();
        connection.close();
    }

    /**
     * 列过滤器QualifierFilter
     * 只查询name列的值
     *
     * @throws IOException
     */
    @Test
    public void qualifierFilter() throws IOException {
        //获取连接
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Table myuser2 = connection.getTable(TableName.valueOf("myuser2"));
        Scan scan = new Scan();
        QualifierFilter qualifierFilter = new QualifierFilter(EQUAL, new SubstringComparator("name"));
        scan.setFilter(qualifierFilter);
        ResultScanner scanner = myuser2.getScanner(scan);
        for (Result result : scanner) {
            System.out.println(Bytes.toString(result.getRow()));
            System.out.println(Bytes.toString(result.getValue("f1".getBytes(), "name".getBytes())));
        }
        myuser2.close();
        connection.close();
    }


    /**
     * 列族过滤器FamilyFilter
     * 查询比f2列族小的所有的列族内的数据
     *
     * @throws IOException
     */
    @Test
    public void familyFilter() throws IOException {
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Table myuser2 = connection.getTable(TableName.valueOf("myuser2"));
        Scan scan = new Scan();
        FamilyFilter familyFilter = new FamilyFilter(LESS, new SubstringComparator("f2"));
        scan.setFilter(familyFilter);
        ResultScanner scanner = myuser2.getScanner(scan);
        for (Result result : scanner) {
            System.out.println(Bytes.toString(result.getRow()));
            System.out.println(Bytes.toInt(result.getValue("f1".getBytes(), "id".getBytes())));
            System.out.println(Bytes.toInt(result.getValue("f1".getBytes(), "age".getBytes())));
            System.out.println(Bytes.toString(result.getValue("f1".getBytes(), "name".getBytes())));
        }
        myuser2.close();
        connection.close();
    }

    /**
     * rowKey过滤器
     * 通过RowFilter过滤比rowKey  0003小的所有值出来
     *
     * @throws IOException
     */
    @Test
    public void rowKeyFilter() throws IOException {
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Table myuser2 = connection.getTable(TableName.valueOf("myuser2"));
        Scan scan = new Scan();
        RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("0003")));
        scan.setFilter(rowFilter);
        ResultScanner scanner = myuser2.getScanner(scan);
        for (Result result : scanner) {
            //获取rowKey
            System.out.println(Bytes.toString(result.getRow()));
            //输出指定列族以及列数据
            System.out.println(Bytes.toInt(result.getValue("f1".getBytes(), "id".getBytes())));
            System.out.println(Bytes.toInt(result.getValue("f1".getBytes(), "age".getBytes())));
            System.out.println(Bytes.toString(result.getValue("f1".getBytes(), "name".getBytes())));
        }
        myuser2.close();
        connection.close();

    }

    /**
     * 通过 scan 全表扫描数据
     *
     * @throws IOException
     */
    @Test
    public void findDataByScan() throws IOException {
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Table myuser2 = connection.getTable(TableName.valueOf("myuser2"));
        //实例全表扫描对象 scan
        Scan scan = new Scan();
        //获取区间的所有数据,返回一个集合
        ResultScanner scanner = myuser2.getScanner(scan);
        //遍历集合 输出数据
        for (Result result : scanner) {
            System.out.println("rowKey --->  " + Bytes.toString(result.getRow()));
            System.out.println(Bytes.toInt(result.getValue("f1".getBytes(), "id".getBytes())));
            System.out.println(Bytes.toString(result.getValue("f1".getBytes(), "name".getBytes())));
            System.out.println(Bytes.toInt(result.getValue("f1".getBytes(), "age".getBytes())));
        }
        myuser2.close();
        connection.close();
    }

    /**
     * 根据起始RowKey查询区间数据
     *
     * @throws IOException
     */
    @Test
    public void findDataByStartRwAndStopRw() throws IOException {
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Table myuser2 = connection.getTable(TableName.valueOf("myuser2"));
        //实例全表扫描对象 scan
        Scan scan = new Scan();
        //设置StartRowKey  和  StopRowKey
        scan.setStartRow("0002".getBytes());
        scan.setStopRow("0005".getBytes());
        //获取区间的所有数据,返回一个集合
        ResultScanner scanner = myuser2.getScanner(scan);
        //遍历集合 输出数据
        for (Result result : scanner) {
            System.out.println(Bytes.toInt(result.getValue("f1".getBytes(), "id".getBytes())));
            System.out.println(Bytes.toString(result.getValue("f1".getBytes(), "name".getBytes())));
            System.out.println(Bytes.toInt(result.getValue("f1".getBytes(), "age".getBytes())));
        }
        myuser2.close();
        connection.close();
    }

    /**
     * 查询指定列族&&特定列数据
     *
     * @throws IOException
     */
    @Test
    public void findDatasByRowKey() throws IOException {
        //1.连接数据库
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        //2.获取数据表
        Table myuser2 = connection.getTable(TableName.valueOf("myuser2"));
        //3.设置要读取数据的rowkey
        Get get = new Get("0002".getBytes());
        //4.查询指定列族数据
        //get.addFamily("f1".getBytes());
        //查询指定列族下特定列的数据
        get.addColumn("f1".getBytes(), "age".getBytes());
        //5.读取数据---->每一行数据
        Result result = myuser2.get(get);
        //6.读取每一行数据的所有列字段,返回数据
        Cell[] cells = result.rawCells();
        //7.遍历数组,输出数据信息
        for (Cell cell : cells) {
            String s = Bytes.toString(CellUtil.cloneQualifier(cell));
            if (s.equals("id") || s.equals("age")) {
                //获得列族
                System.out.println(Bytes.toString(CellUtil.cloneFamily(cell)));
                //获得具体列
                System.out.println(Bytes.toString(CellUtil.cloneQualifier(cell)));
                //获得具体列的value
                System.out.println(Bytes.toInt(CellUtil.cloneValue(cell)));
            } else {
                //获得列族
                System.out.println(Bytes.toString(CellUtil.cloneFamily(cell)));
                //获得具体列
                System.out.println(Bytes.toString(CellUtil.cloneQualifier(cell)));
                //获得具体列的value
                System.out.println(Bytes.toString(CellUtil.cloneValue(cell)));
            }

        }
        //8.关闭连接
        myuser2.close();
        connection.close();
    }

    /**
     * 根据主键rowkey查询数据
     *
     * @throws IOException
     */
    @Test
    public void findDataByRowKey() throws IOException {
        //1.连接数据库
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        //2.获取要查询的数据表
        Table myuser2 = connection.getTable(TableName.valueOf("myuser2"));
        //3.实例get对象,设置要读取数据的rowkey
        Get get = new Get("001".getBytes());
        //4.获取该rowkey所对应的数据
        Result result = myuser2.get(get);
        //5.读取数据---->每一行数据
        Cell[] cells = result.rawCells();
        //6.读取每一行数据的所有列字段,返回数据
        for (Cell cell : cells) {
            //输出列族
            System.out.println(Bytes.toString(CellUtil.cloneFamily(cell)));
            //输出列
            System.out.println(Bytes.toString(CellUtil.cloneQualifier(cell)));
            //输出列的value值
            System.out.println(Bytes.toString(CellUtil.cloneValue(cell)));
        }
        //7.关闭连接
        connection.close();
    }

    /**
     * 插入多条数据,list集合插入数据
     *
     * @throws IOException
     */
    @Test
    public void putDataList() throws IOException {
        //1.连接数据库,找到要添加数据的表
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Table myuser2 = connection.getTable(TableName.valueOf("myuser2"));
        //2.实例多个put对象,插入不同数据
        Put put = new Put("0002".getBytes());
        put.addColumn("f1".getBytes(), "id".getBytes(), Bytes.toBytes(1));
        put.addColumn("f1".getBytes(), "name".getBytes(), Bytes.toBytes("曹操"));
        put.addColumn("f1".getBytes(), "age".getBytes(), Bytes.toBytes(30));
        put.addColumn("f2".getBytes(), "sex".getBytes(), Bytes.toBytes("1"));
        put.addColumn("f2".getBytes(), "address".getBytes(), Bytes.toBytes("沛国谯县"));
        put.addColumn("f2".getBytes(), "phone".getBytes(), Bytes.toBytes("16888888888"));
        put.addColumn("f2".getBytes(), "say".getBytes(), Bytes.toBytes("helloworld"));

        Put put2 = new Put("0003".getBytes());
        put2.addColumn("f1".getBytes(), "id".getBytes(), Bytes.toBytes(2));
        put2.addColumn("f1".getBytes(), "name".getBytes(), Bytes.toBytes("刘备"));
        put2.addColumn("f1".getBytes(), "age".getBytes(), Bytes.toBytes(32));
        put2.addColumn("f2".getBytes(), "sex".getBytes(), Bytes.toBytes("1"));
        put2.addColumn("f2".getBytes(), "address".getBytes(), Bytes.toBytes("幽州涿郡涿县"));
        put2.addColumn("f2".getBytes(), "phone".getBytes(), Bytes.toBytes("17888888888"));
        put2.addColumn("f2".getBytes(), "say".getBytes(), Bytes.toBytes("talk is cheap , show me the code"));


        Put put3 = new Put("0004".getBytes());
        put3.addColumn("f1".getBytes(), "id".getBytes(), Bytes.toBytes(3));
        put3.addColumn("f1".getBytes(), "name".getBytes(), Bytes.toBytes("孙权"));
        put3.addColumn("f1".getBytes(), "age".getBytes(), Bytes.toBytes(35));
        put3.addColumn("f2".getBytes(), "sex".getBytes(), Bytes.toBytes("1"));
        put3.addColumn("f2".getBytes(), "address".getBytes(), Bytes.toBytes("下邳"));
        put3.addColumn("f2".getBytes(), "phone".getBytes(), Bytes.toBytes("12888888888"));
        put3.addColumn("f2".getBytes(), "say".getBytes(), Bytes.toBytes("what are you 弄啥嘞!"));

        //添加多个put对象数据
        ArrayList<Put> list = new ArrayList<>();
        list.add(put);
        list.add(put2);
        list.add(put3);
        myuser2.put(list);
        //3.关闭连接
        myuser2.close();
        connection.close();
    }

    /**
     * 插入单条数据
     *
     * @throws IOException
     */
    @Test
    public void putData() throws IOException {
        //1.连接数据库
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        //获取要添加数据的表名
        Table myuser2 = connection.getTable(TableName.valueOf("myuser2"));
        //2.实例put对象,插入数据
        Put put = new Put("001".getBytes());
        put.addColumn("f1".getBytes(), "name".getBytes(),Bytes.toBytes("zhangsan"));
        put.addColumn("f1".getBytes(), "id".getBytes(), Bytes.toBytes(1));
        put.addColumn("f1".getBytes(), "age".getBytes(),Bytes.toBytes(18));
        myuser2.put(put);
        //3.关闭连接
        connection.close();
    }

    /**
     * 创建表
     *
     * @throws IOException
     */
    @Test
    public void createTable() throws IOException {
        //1.连接数据库
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        //2.实例admin管理员
        Admin admin = connection.getAdmin();
        //2.1设置表名
        TableName tableName = TableName.valueOf("myuser2");
        //2.2设置表结构
        HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
        //2.3设置列族
        HColumnDescriptor f1 = new HColumnDescriptor("f1");
        HColumnDescriptor f2 = new HColumnDescriptor("f2");
        //2.4建立表与列族之间的关系
        hTableDescriptor.addFamily(f1);
        hTableDescriptor.addFamily(f2);
        //2.5创建表
        admin.createTable(hTableDescriptor);
        //3.关闭连接
        admin.close();
        connection.close();
    }


    @Test
    public void putDataList1() throws IOException {
        //1.连接数据库,找到要添加数据的表
        configuration.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Table myuser2 = connection.getTable(TableName.valueOf("user"));
        //2.实例多个put对象,插入不同数据
        Put put = new Put("0002".getBytes());
        put.addColumn("f1".getBytes(), "id".getBytes(), Bytes.toBytes(1));
        put.addColumn("f1".getBytes(), "name".getBytes(), Bytes.toBytes("曹操"));
        put.addColumn("f1".getBytes(), "age".getBytes(), Bytes.toBytes(30));
        put.addColumn("f2".getBytes(), "sex".getBytes(), Bytes.toBytes("1"));
        put.addColumn("f2".getBytes(), "address".getBytes(), Bytes.toBytes("沛国谯县"));
        put.addColumn("f2".getBytes(), "phone".getBytes(), Bytes.toBytes("16888888888"));
        put.addColumn("f2".getBytes(), "say".getBytes(), Bytes.toBytes("helloworld"));

        Put put2 = new Put("0003".getBytes());
        put2.addColumn("f1".getBytes(), "id".getBytes(), Bytes.toBytes(2));
        put2.addColumn("f1".getBytes(), "name".getBytes(), Bytes.toBytes("刘备"));
        put2.addColumn("f1".getBytes(), "age".getBytes(), Bytes.toBytes(32));
        put2.addColumn("f2".getBytes(), "sex".getBytes(), Bytes.toBytes("1"));
        put2.addColumn("f2".getBytes(), "address".getBytes(), Bytes.toBytes("幽州涿郡涿县"));
        put2.addColumn("f2".getBytes(), "phone".getBytes(), Bytes.toBytes("17888888888"));
        put2.addColumn("f2".getBytes(), "say".getBytes(), Bytes.toBytes("talk is cheap , show me the code"));


        Put put3 = new Put("0004".getBytes());
        put3.addColumn("f1".getBytes(), "id".getBytes(), Bytes.toBytes(3));
        put3.addColumn("f1".getBytes(), "name".getBytes(), Bytes.toBytes("孙权"));
        put3.addColumn("f1".getBytes(), "age".getBytes(), Bytes.toBytes(35));
        put3.addColumn("f2".getBytes(), "sex".getBytes(), Bytes.toBytes("1"));
        put3.addColumn("f2".getBytes(), "address".getBytes(), Bytes.toBytes("下邳"));
        put3.addColumn("f2".getBytes(), "phone".getBytes(), Bytes.toBytes("12888888888"));
        put3.addColumn("f2".getBytes(), "say".getBytes(), Bytes.toBytes("what are you 弄啥嘞!"));

        //添加多个put对象数据
        ArrayList<Put> list = new ArrayList<>();
        list.add(put);
        list.add(put2);
        list.add(put3);
        myuser2.put(list);
        //3.关闭连接
        myuser2.close();
        connection.close();
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值