java操作HBase

创建一个学生信息表,用来存储学生的姓名(姓名作为行键,且假设姓名不会重复)以及考试成绩,其中考试成绩(score)是一个列族,存储了各个科目的考试成绩。然后向student中添加数据

1、HBase依赖

<dependency>
	<groupId>org.apache.hbase</groupId>
	<artifactId>hbase-server</artifactId>
	<version>1.4.13</version>
</dependency>
<dependency>
	<groupId>org.apache.hbase</groupId>
	<artifactId>hbase-client</artifactId>
	<version>1.4.13</version>
</dependency>

2、HBase数据源

package com.example.demo.config;
 
import com.example.demo.service.ICodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
 
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
@Component
@Order(1) 
public class NmsHBaseSource implements ApplicationRunner {
 
	// 管理HBase的配置信息
    public static Configuration conf;
	// 管理HBase的连接
    public static Connection conn;
	// 管理HBase数据库的连接
    public static Admin admin;
 
    @Override
    public void run(ApplicationArguments args) throws Exception {
		conf = HBaseConfiguration.create();
        System.setProperty("HADOOP_USER_NAME", "hadoop");
        conf.set("HADOOP_USER_NAME", "hadoop");
        conf.set("hbase.root.dir", "hdfs://master:9000/hbase");
        conf.set("hbase.zookeeper.quorum", "master");//配置Zookeeper的ip地址
        conf.set("hbase.zookeeper.property.clientPort", "2181");//配置zookeeper的端口

        conn = ConnectionFactory.createConnection(conf);
        admin = conn.getAdmin();
    }
	
	 /**
     * 关闭所有连接
     *
     * @throws IOException 可能出现的异常
     */
    public static void close() throws IOException {
        if (admin != null)
            admin.close();
        if (conn != null)
            conn.close();
    }
	
	/**
     * 创建表
     * @param myTableName 表名
     * @param colFamily 列族名的数组
     * @throws IOException 可能出现的异常
     */
    public static void createTable(String myTableName, String[] colFamily) throws IOException {
        TableName tableName = TableName.valueOf(myTableName);
        if (admin.tableExists(tableName)) {
            logger.info(myTableName + "表已经存在");
        } else {
            HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
            for (String str : colFamily) {
                HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(str);
                hTableDescriptor.addFamily(hColumnDescriptor);
            }
            admin.createTable(hTableDescriptor);
        }
    }
	
	 /**
     * 添加数据
     * @param tableName 表名
     * @param rowkey 行键
     * @param colFamily 列族
     * @param col 列
     * @param value 值
     * @throws IOException 可能出现的异常
     */
    public static void insertData(String tableName,String rowkey,String colFamily,String col,String value) throws IOException {
        Table table = conn.getTable(TableName.valueOf(tableName));
        Put put = new Put(rowkey.getBytes());
        put.addColumn(colFamily.getBytes(),col.getBytes(),value.getBytes());
        table.put(put);
        table.close();
    }
	
	/**
     * 根据行键删除数据
     * @param tableName 表名
     * @param rowkey 行键
     * @throws IOException 可能出现的异常
     */
    public static void deleteData(String tableName,String rowkey) throws IOException {
        Table table = conn.getTable(TableName.valueOf(tableName));
        Delete delete = new Delete(rowkey.getBytes());
        table.delete(delete);
        table.close();
    }

    /**
     * 获取数据
     * @param tableName 表名
     * @param rowkey 行键
     * @param colFamily 列族
     * @param col 列
     * @throws IOException 可能出现的异常
     */
    public static void getData(String tableName,String rowkey,String colFamily,String col) throws IOException {
        Table table = conn.getTable(TableName.valueOf(tableName));
        Get get = new Get(rowkey.getBytes());
        get.addColumn(colFamily.getBytes(),col.getBytes());
        Result result = table.get(get);
        System.out.println(new String(result.getValue(colFamily.getBytes(),col.getBytes())));
        table.close();
    }

    public static void main(String[] args) throws IOException {
        init();
        createTable("student",new String[]{"score"});
        insertData("student","zhangsan","score","English","69");
        insertData("student","zhangsan","score","Math","86");
        insertData("student","zhangsan","score","Computer","77");
        getData("student","zhangsan","score","Computer");
        close();
    }
}

3、Hbase过滤器查询

过滤器可以分为两种:比较过滤器和专用过滤器

比较过滤器 

LESS —— 小于

LESS_OR_EQUAL —— 小于等于

EQUAL —— 等于

NOT_EQUAL —— 不等于

GREATER_OR_EQUAL —— 大于等于

GREATER —— 大于

NO_OP —— 排除所有

专用过滤器

BinaryComparator —— 按字节索引顺序比较指定字节数组,采用Bytes.compareTo(byte[])
BinaryPrefixComparator —— 跟前面相同,只是比较左端的数据是否相同
NullComparator —— 判断给定的是否为空
BitComparator —— 按位比较
RegexStringComparator —— 提供一个正则的比较器,仅支持 EQUAL 和非EQUAL
SubstringComparator —— 判断提供的子串是否出现在value中

  • 3.1、ResultScanner结果处理handleResultScanner

/**
 *	ResultScanner结果解析
 */
public void handleResultScanner(ResultScanner scanner) throws IOException {
	//因为ResultScanner类继承了迭代器
	//使用增强for循环遍历
	for (Result rs : scanner) {
	String id = Bytes.toString(rs.getRow());
	System.out.println("当前行的rowkey为:" + id);
	//继续增强for循环得到每一行中的每一个单元格(列)
	//获取一行中的所有单元格
	for (Cell cell : rs.listCells()) {
		//获取该单元格属于的列簇
		String family = Bytes.toString(CellUtil.cloneFamily(cell));
		//获取该单元格的列名
		String colName = Bytes.toString(CellUtil.cloneQualifier(cell));
		//获取该单元格的列值
		String value = Bytes.toString(CellUtil.cloneValue(cell));
		System.out.println(family + ":" + colName + "的值为:" + value);
	}
​
	String name = Bytes.toString(rs.getValue("info".getBytes(), "name".getBytes()));
	String age = Bytes.toString(rs.getValue("info".getBytes(), "age".getBytes()));
	String gender = Bytes.toString(rs.getValue("info".getBytes(), "gender".getBytes()));
	String clazz = Bytes.toString(rs.getValue("info".getBytes(), "clazz".getBytes()));
	System.out.println("学号:" + id + ",姓名:" + name + ",年龄:" + age + ",性别:" + gender + ",班级:" + clazz);
	
}

3.2、rowKey过滤器RowFilter

/**
 *  行键过滤器
 *  通过RowFilter与BinaryComparator过滤比rowKey 1500100010小的所有值出来
 */
@Test
public void RowFilter1(){
	try {
		//获取表的实例
		HTableInterface students = conn.getTable("students");
​
		BinaryComparator binaryComparator = new BinaryComparator("1500100010".getBytes());
​
		//创建一个行键过滤器的对象
		RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.LESS, binaryComparator);
​
		Scan scan = new Scan();
		scan.setFilter(rowFilter);
​
		ResultScanner scanner = students.getScanner(scan);
		handleResultScanner(scanner);
​
	} catch (IOException e) {
		e.printStackTrace();
	}
}

3.3、列族过滤器FamilyFilter

/**
 * 	通过FamilyFilter与SubstringComparator查询列簇名包含in的所有列簇下面的数据
 */
@Test
public void FamilyFilter1(){
	try {
		//获取表的实例
		HTableInterface students = conn.getTable("students");
​
		//创建一个比较器对象
		//只要列簇名中包含了in,就把该列簇下的所有列查询出来
		SubstringComparator substringComparator = new SubstringComparator("in");
​
		//创建列簇过滤器
		FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL, substringComparator);
​
		Scan scan = new Scan();
		scan.setFilter(familyFilter);
​
		//获取数据
		ResultScanner scanner = students.getScanner(scan);
		handleResultScanner(scanner);
​
​
	} catch (IOException e) {
		e.printStackTrace();
	}
}

/**
 *	通过FamilyFilter与 BinaryPrefixComparator 过滤出列簇以i开头的列簇下的所有数据
 *
 */
@Test
public void FamilyFilter2(){
	try {
		//获取表的实例
		HTableInterface students = conn.getTable("students");
​
		//创建前缀比较器
		BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator("i".getBytes());
​
		//创建列簇过滤器
		FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL, binaryPrefixComparator);
​
		Scan scan = new Scan();
		scan.setFilter(familyFilter);
​
		ResultScanner scanner = students.getScanner(scan);
		handleResultScanner(scanner);
​
	} catch (IOException e) {
		e.printStackTrace();
	}
}

3.4、列过滤器QualifierFilter

/**
 * 通过QualifierFilter与SubstringComparator查询列名包含ge的列的值
 *
 */
@Test
public void QualifierFilter1(){
	try {
		//获取表的实例
		HTableInterface students = conn.getTable("students");
​
		//创建包含比较器
		//age
		//gender
		SubstringComparator substringComparator = new SubstringComparator("ge");
​
		//创建一个列过滤器
		QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.EQUAL, substringComparator);
​
		Scan scan = new Scan();
		scan.setFilter(qualifierFilter);
​
		ResultScanner scanner = students.getScanner(scan);
		handleResultScanner(scanner);
​
​
	} catch (IOException e) {
		e.printStackTrace();
	}
}

/**
 *
 * 通过QualifierFilter与SubstringComparator查询列名包含ge的列的值
 */
@Test
public void QualifierFilter2(){
	try {
		//获取表的实例
		HTableInterface students = conn.getTable("students");
​
		SubstringComparator substringComparator = new SubstringComparator("am");
​
		//创建列过滤器
		QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.EQUAL, substringComparator);
​
		Scan scan = new Scan();
		scan.setFilter(qualifierFilter);
​
		ResultScanner scanner = students.getScanner(scan);
		handleResultScanner(scanner);
​
	} catch (IOException e) {
		e.printStackTrace();
	}
}

3.5、列值过滤器ValueFilter

/**
 *	通过ValueFilter与BinaryPrefixComparator过滤出所有的cell中值以 "张" 开头的学生
 */
@Test
public void ValueFilter1() {
	try {
		//获取表的实例
		HTableInterface students = conn.getTable("students");
​
		//创建前缀比较器
		BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator("张".getBytes());
​
		//创建列值过滤器的对象
		ValueFilter valueFilter = new ValueFilter(CompareFilter.CompareOp.EQUAL, binaryPrefixComparator);
​
		Scan scan = new Scan();
		scan.setFilter(valueFilter);
​
		ResultScanner scanner = students.getScanner(scan);
​
		//因为ResultScanner类继承了迭代器
		//使用增强for循环遍历
//            for (Result rs : scanner) {
//                String id = Bytes.toString(rs.getRow());
//                System.out.println("当前行的rowkey为:" + id);
//                //继续增强for循环得到每一行中的每一个单元格(列)
//                //获取一行中的所有单元格
//                for (Cell cell : rs.listCells()) {
//                    //获取该单元格属于的列簇
//                    String family = Bytes.toString(CellUtil.cloneFamily(cell));
//                    //获取该单元格的列名
//                    String colName = Bytes.toString(CellUtil.cloneQualifier(cell));
//                    //获取该单元格的列值
//                    String value = Bytes.toString(CellUtil.cloneValue(cell));
//                    System.out.println(family + ":" + colName + "的值为:" + value);
//                }
//            }
​
		handleResultScanner(scanner);
	} catch (IOException e) {
		e.printStackTrace();
	}
}

/**
 *	过滤出文科的学生,只会返回以文科开头的数据列,其他列的数据不符合条件,不会返回
 */
@Test
public void ValueFilter12(){
	try {
		//获取表的实例
		HTableInterface students = conn.getTable("students");
​
		//创建正则比较器
		RegexStringComparator regexStringComparator = new RegexStringComparator("^文科.*");
​
		//创建列值过滤器
		ValueFilter valueFilter = new ValueFilter(CompareFilter.CompareOp.EQUAL, regexStringComparator);
​
		Scan scan = new Scan();
		scan.setFilter(valueFilter);
​
		ResultScanner scanner = students.getScanner(scan);
		handleResultScanner(scanner);
​
​
	} catch (IOException e) {
		e.printStackTrace();
	}
}

3.6、单列值过滤器 SingleColumnValueFilter

/**
 * 单列值过滤器
 * SingleColumnValueFilter会返回满足条件的cell所在行的所有cell的值(即会返回一行数据)
 *
 * 通过SingleColumnValueFilter与查询文科班所有学生信息
 */
@Test
public void SingleColumnValueFilter(){
	try {
		//获取表的实例
		HTableInterface students = conn.getTable("students");
​
		//创建一个正则比较器
		RegexStringComparator regexStringComparator = new RegexStringComparator("^文科.*");
​
		//创建单列值过滤器对象
		SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
				"info".getBytes(),
				"clazz".getBytes(),
				CompareFilter.CompareOp.EQUAL,
				regexStringComparator
		);
​
		Scan scan = new Scan();
		scan.setFilter(singleColumnValueFilter);
​
		ResultScanner scanner = students.getScanner(scan);
		handleResultScanner(scanner);
​
​
	} catch (IOException e) {
		e.printStackTrace();
	}
}

3.7、列值排除过滤器SingleColumnValueExcludeFilter

/**
 * 列值排除过滤器
 * 与SingleColumnValueFilter相反,会排除掉指定的列,其他的列全部返回
 *
 * 通过SingleColumnValueExcludeFilter与BinaryComparator查询文科一班所有学生信息,最终不返回clazz列
 */
@Test
public void SingleColumnValueExcludeFilter(){
	try {
		//获取表的实例
		HTableInterface students = conn.getTable("students");
​
		//创建一个二进制比较器
		BinaryComparator binaryComparator = new BinaryComparator("文科一班".getBytes());
​
		//创建一个列值排除过滤器
		SingleColumnValueExcludeFilter singleColumnValueExcludeFilter = new SingleColumnValueExcludeFilter(
				"info".getBytes(),
				"clazz".getBytes(),
				CompareFilter.CompareOp.EQUAL,
				binaryComparator
		);
​
		Scan scan = new Scan();
		scan.setFilter(singleColumnValueExcludeFilter);
​
		ResultScanner scanner = students.getScanner(scan);
		handleResultScanner(scanner);
​
​
	} catch (IOException e) {
		e.printStackTrace();
	}
}

3.8、rowKey前缀过滤器PrefixFilter

/**
 * rowkey前缀过滤器
 *
 * 通过PrefixFilter查询以150010008开头的所有前缀的rowkey
 */
@Test
public void PrefixFilter(){
	try {
		//获取表的实例
		HTableInterface students = conn.getTable("students");
​
		//创建rowkey前缀过滤器
		PrefixFilter prefixFilter = new PrefixFilter("150010008".getBytes());
		Scan scan = new Scan();
​
		scan.setFilter(prefixFilter);
		ResultScanner scanner = students.getScanner(scan);
		handleResultScanner(scanner);
​
​
	} catch (IOException e) {
		e.printStackTrace();
	}
​
}

3.9、分页过滤器PageFilter

/**
 * 分页过滤器
 * 分页有两个条件
 * pageNum  第几页
 * pageSize 每页有几条
 */
@Test
public void pageFilter() throws IOException {

	int pageNum = 3;
	int pageSize = 2;


	/*
	分为两种情况判断:
	第一页
	其他页
	 */
	if (pageNum == 1){
		Scan scan = new Scan();
		//设置起始rowKey
		scan.setStartRow("".getBytes());
		//设置最大的返回结果,返回pageSize条
		scan.setMaxResultSize(pageSize);
		//分页过滤器
		PageFilter pageFilter = new PageFilter(pageSize);
		scan.setFilter(pageFilter);

		ResultScanner resultScanner = table.getScanner(scan);
		for (Result result : resultScanner) {
			byte[] row = result.getRow();
			System.out.println("数据的rowKey为" + Bytes.toString(row));
			List<Cell> cells = result.listCells();
			for (Cell cell : cells) {
				byte[] qualifier = cell.getQualifier();
				byte[] family = cell.getFamily();
				byte[] value = cell.getValue();
				//id列和age列是整型数据
				if ("f1".equals(Bytes.toString(family)) && "id".equals(Bytes.toString(qualifier)) || "age".equals(Bytes.toString(value))){
					System.out.println("列族为"+Bytes.toString(family)+"列名为"+Bytes.toString(qualifier)+"列值为"+Bytes.toInt(value));
				} else {
					System.out.println("列族为"+Bytes.toString(family)+"列名为"+Bytes.toString(qualifier)+"列值为"+Bytes.toString(value));
				}
			}
		}
	} else {
		String startRow = "";
		Scan scan = new Scan();
		/*
		第二页的起始rowKey = 第一页的结束rowKey + 1
		第三页的起始rowKey = 第二页的结束rowKey + 1
		 */
		int resultSize = (pageNum - 1) * pageSize + 1;
		scan.setMaxResultSize(resultSize);
		//设置一次性往前扫描5条,最后一个rowKey是第三页起始rowKey
		PageFilter pageFilter = new PageFilter(resultSize);
		scan.setFilter(pageFilter);
		//resultScanner里面有5条数据
		ResultScanner scanner = table.getScanner(scan);
		for (Result result : scanner) {
			//获取rowKey
			byte[] row = result.getRow();
			//最后一次循环遍历 rowKey为0005
			startRow = Bytes.toString(row);
		}
		Scan scan1 = new Scan();
		scan1.setStartRow(startRow.getBytes());
		scan1.setMaxResultSize(pageSize);

		PageFilter pageFilter1 = new PageFilter(pageSize);
		scan1.setFilter(pageFilter1);

		ResultScanner scanner1 = table.getScanner(scan1);
		for (Result result : scanner1) {
			byte[] row = result.getRow();
			System.out.println("数据的rowKey为" + Bytes.toString(row));
			List<Cell> cells = result.listCells();
			for (Cell cell : cells) {
				// byte[] qualifier = cell.getQualifier();
				// byte[] family = cell.getFamily();
				// byte[] value = cell.getValue();
				String family = Bytes.toString(CellUtil.cloneFamily(cell));
				//获取该单元格的列名
				String colName = Bytes.toString(CellUtil.cloneQualifier(cell));
				//获取该单元格的列值
				String value = Bytes.toString(CellUtil.cloneValue(cell));
				//id列和age列是整型数据
				if ("f1".equals(Bytes.toString(family)) && "id".equals(Bytes.toString(qualifier)) || "age".equals(Bytes.toString(value))){
					System.out.println("列族为"+Bytes.toString(family)+"列名为"+Bytes.toString(qualifier)+"列值为"+Bytes.toInt(value));
				} else {
					System.out.println("列族为"+Bytes.toString(family)+"列名为"+Bytes.toString(qualifier)+"列值为"+Bytes.toString(value));
				}
			}
		}
	}
}

3.10、多过滤器综合查询FilterList

/**
 * 通过运用4种比较器过滤出姓于,年纪大于23岁,性别为女,且是理科的学生。
 *
 * 正则比较器   RegexStringComparator
 * 包含比较器   SubstringComparator
 * 二进制前缀比较器   BinaryPrefixComparator
 * 二进制比较器      BinaryComparator
 *
 */
@Test
public void FilterData1(){
	try {
		//获取表的实例
		HTableInterface students = conn.getTable("students");
​
		/**
		 *  第一个过滤器,过滤出是理科开头的班级
		 */
		RegexStringComparator regexStringComparator = new RegexStringComparator("^理科.*");
		//单列值过滤器
		SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("info".getBytes(), "clazz".getBytes(),
				CompareFilter.CompareOp.EQUAL, regexStringComparator);
​
		/**
		 * 第二个过滤器,过滤出性别是女生的
		 */
​
		SubstringComparator substringComparator = new SubstringComparator("女");
		SingleColumnValueFilter singleColumnValueFilter1 = new SingleColumnValueFilter("info".getBytes(), "gender".getBytes(),
				CompareFilter.CompareOp.EQUAL, substringComparator);
​
		/**
		 * 第三个过滤器,过滤出年龄大于23岁的
		 */
		BinaryComparator binaryComparator = new BinaryComparator("20".getBytes());
		SingleColumnValueFilter singleColumnValueFilter2 = new SingleColumnValueFilter("info".getBytes(), "age".getBytes(),
				CompareFilter.CompareOp.GREATER, binaryComparator);
​
​
		/**
		 * 第四个过滤器,过滤出姓于的学生
		 */
		BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator("于".getBytes());
		SingleColumnValueFilter singleColumnValueFilter3 = new SingleColumnValueFilter("info".getBytes(), "name".getBytes(),
				CompareFilter.CompareOp.EQUAL, binaryPrefixComparator);
​
​
		Scan scan = new Scan();
​
		//要想实现多个需求同时过滤,就需要创建多个过滤器,添加到一个过滤器列表中
		//然后将过滤器列表传给扫描器scan
		FilterList filterList = new FilterList();
		filterList.addFilter(singleColumnValueFilter);
		filterList.addFilter(singleColumnValueFilter1);
		filterList.addFilter(singleColumnValueFilter2);
		filterList.addFilter(singleColumnValueFilter3);
​
		scan.setFilter(filterList);
​
		ResultScanner scanner = students.getScanner(scan);
​
		handleResultScanner(scanner);
​
​
	} catch (IOException e) {
		e.printStackTrace();
	}
​
}

/**
 * 	过滤出学号是以15001001开头的文科学生
 */
@Test
public void filterData2(){
	try {
		//获取表的实例
		HTableInterface students = conn.getTable("students");
​
		/**
		 *  创建第一个过滤器,过滤是以15001001开头的rowkey
		 */
		BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator("15001001".getBytes());
		//创建行键过滤器
		RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, binaryPrefixComparator);
​
		/**
		 * 创建第二个过滤器,过滤出文科的学生
		 */
		RegexStringComparator regexStringComparator = new RegexStringComparator("^文科.*");
		SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("info".getBytes(), "clazz".getBytes(),
				CompareFilter.CompareOp.EQUAL,
				regexStringComparator);
​
​
		FilterList filterList = new FilterList();
		filterList.addFilter(rowFilter);
		filterList.addFilter(singleColumnValueFilter);
​
		Scan scan = new Scan();
		scan.setFilter(filterList);
		ResultScanner scanner = students.getScanner(scan);
		handleResultScanner(scanner);
​
	} catch (IOException e) {
		e.printStackTrace();
	}
​
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/450780.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python元组(Tuple)深度解析!

目录 1. 什么是元组&#xff1f; 2. 创建元组 3.访问元组 4.元组的运算 5.修改元组不可行 6.元组的应用场景 前面的博客里&#xff0c;我们详细介绍了列表&#xff08;List&#xff09;这一种数据类型&#xff0c;现在我们来讲讲与列表相似的一种数据类型&#xff0c;元组…

【LeetCode: 380. O(1) 时间插入、删除和获取随机元素 + 数据结构设计】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

学习大数据,所需要Java基础(9)

文章目录 网络编程实现简答客户端和服务器端的交互编写客户端编写服务端 文件上传文件上传客户端以及服务器端实现文件上传服务器端实现&#xff08;多线程&#xff09;文件上传服务器端&#xff08;连接池版本&#xff09;关闭资源工具类 BS架构服务器案例案例分析BS结构服务器…

【C++】AVL树的插入、旋转

目录 一、AVL树介绍1.1 概念1.2 定义 二、AVL树的实现2.1 插入2.2 旋转2.2.1 左单旋2.2.2 右单旋2.2.3 左右双旋2.2.4 右左双旋 一、AVL树介绍 1.1 概念 AVL树是高度平衡的二叉搜索树&#xff0c;相比普通的二叉搜索树&#xff0c;它防止了变成单支树的情况。因为AVL树每插入…

bash: mysqldump: command not found

问题&#xff1a;在linux上执行mysql备份的时候&#xff0c;出现此异常 mysqldump命令找不到 解决&#xff1a; 1、找到mysql目录&#xff08;找到mysql可执行命令目录&#xff09; which mysql 有图可知&#xff0c;mysql安装在&#xff1a; /usr1/local/java/mysql 2、my…

redis 中的八大问题

前言 在分布式系统中&#xff0c;由于redis分布式锁相对于更简单和高效&#xff0c;成为了分布式锁的首先&#xff0c;被我们用到了很多实际业务场景当中。 但不是说用了redis分布式锁&#xff0c;就可以高枕无忧了&#xff0c;如果没有用好或者用对&#xff0c;也会引来一些意…

世界的本质是旋转(7) 野路子PSK 接收机上层同步的技巧与缺陷

上一篇文章里&#xff0c;我们以BPSK为例子&#xff0c;介绍了nPSK&#xff08;n2,4,8&#xff09;波形的接收、解调中的同步技术。 前文阐述的同步技术所工作的对象是复平面的坐标&#xff0c;X轴是实部、Y轴是虚部。当完成时钟、频率同步后&#xff0c;就获得了一串整数&…

sqlserver中将csv非空间数据(带点坐标)转为空间数据

1、导入csv数据 2、修改字段shape为空间字段 ALTER TABLE FJPOIHB66 ALTER COLUMN shape geometry;3、空间字段转字符串 UPDATE FJPOIHB66 SET shape geometry::STGeomFromText(CONVERT(nvarchar(254),shape), 4326);4、设置主键字段 5、即可

Instagram被封了?Ins封号的6个常见原因及防封技巧

现在&#xff0c;Instagram 对于跨境电商和社交媒体营销人员来说十分重要。然而&#xff0c;许多用户发现他们的Instagram刚注册就被封&#xff0c;大家要知道 Instagram 和 Facebook 等其他平台一样&#xff0c;对账户管理的管控机制非常严格&#xff0c;不过&#xff0c;Inst…

nut-ui组件库icon中使用阿里图标

1.需求 基本每个移动端组件库都有组件 icon组件 图标组件、 但是很多组件库中并找不到我们需要的图标 这时候 大家有可能会找图标库 最大众的就是iconfont的图标了 2.使用 有很多方式去使用这个东西 比如将再限链接中的css引入 在使用 直接下载图标 symbol 方式 等....…

【群环域】多项式环基础

目录 一. 多项式环的基本定义 二. 环与多项式环 三. 多项式环的性质 四. 多项式环的次数&#xff08;degree&#xff09; 五. 多变量多项式 六. 多变量多项式环R的同态 一. 多项式环的基本定义 令R代表环&#xff08;Ring&#xff09;&#xff0c;多项式环中x对应的系数…

【C语言】自定义类型:结构体

1. 结构体类型的声明 1.1 结构体回顾 结构是⼀些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.1.1 结构的声明 struct tag {member-list; }variable-list; 例如描述⼀个学⽣&#xff1a; struct Stu {char name[20];//名字int age;//年…

【C语言】strcpy函数的超细节详解(什么是strcpy,如何模拟实现strcpy?)

目录 一、观察strcpy()库函数的功能与实现 二、模仿实现strcpy()函数 &#x1f50d;优化代码 &#x1f50d;assert断言拦截 &#x1f50d;const修饰常量指针 &#x1f50d;返回值的加入 三、共勉 一、观察strcpy()库函数的功能与实现 首先我们先来观察一下库函数strcpy去实现…

forward请求转发、include请求转发

forward请求转发&#xff0c;执行到这里就请求转发去执行Servlet4 include请求转发在执行完Servlet4之后&#xff0c;还会回来执行完。

五大模型大比拼:Claude3、Gemini、Sora、GPTs与GPT-4的优缺点分析

课程安排 学习内容 第一章 2024年AI领域最新技术 1.OpenAI新模型-GPT-5 2.谷歌新模型-Gemini Ultra 3.Meta新模型-LLama3 4.科大讯飞-星火认知 5.百度-文心一言 6.MoonshotAI-Kimi 7.智谱AI-GLM-4 第二章 OpenAI开发者大会后GPT最新技术 1.最新大模型GPT-4 Turbo详细介绍…

鞋服品牌如何计算门店盈亏平衡?

在鞋服品牌的运营中&#xff0c;门店盈亏平衡是衡量门店经营效果的重要指标。盈亏平衡点意味着门店在达到这一销售水平时&#xff0c;既能够覆盖所有固定和变动成本&#xff0c;又能实现零利润或零亏损。计算门店盈亏平衡有助于品牌更好地理解门店的经营状况&#xff0c;制定合…

解决LangChain构建知识向量库的过程中官方API无法自定义文本切割方式的问题-例如按行切分

自定义切分构成知识向量库的文本o(&#xffe3;▽&#xffe3;)ブ 在使用大模型和知识向量库进行问题问答的过程中&#xff0c;由于一些LangChain切分文本功能上的限制影响了模型的回答效果为了解决该问题故诞生此文档&#xff0c;如果有说的不对的&#xff0c;或者想交流的非…

Vue3中computed、watch、watchEffect的区别

三者都是侦听工具&#xff0c;实现的是观察者模式&#xff0c;横向对比 &#xff08;1&#xff09;依赖&#xff1a;指的是响应性依赖&#xff0c;也就是侦听 ref、reactive 这类具有响应性的对象。 &#xff08;2&#xff09;watch&#xff1a;默认情况下&#xff0c;被侦听对…

Spring AOP常见面试题

目录 一、对于AOP的理解 二、Spring是如何实现AOP的 1、execution表达式 2、annotation 3、基于Spring API&#xff0c;通过xml配置的方式。 4、基于代理实现 三、Spring AOP的实现原理 四、Spring是如何选择使用哪种动态代理 1、Spring Framework 2、Spring Boot 五…

CUDA入门之统一内存

原文来自CUDA 编程入门之统一内存 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础教程 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质…