当前位置: 首页 > news >正文

ClickHouse 入门

简介

ClickHouse 是一个列式数据库,传统的数据库一般是按行存储,而ClickHouse则是按列存储,每一列都有自己的存储空间,并且只存储该列的数值,而不是存储整行的数据。这样做主要有几个好处,压缩率高,查询速度款、支持高并发,ClickHouse在处理大规模数据时具有很高的性能。

优势:

  • 数据压缩率高: 由于每列存放相同类型的数据,这些数据在存储时可以采用更高效的压缩算法,从而节省存储空间。
  • 查询速度快: 列存储适合于针对某些特定列的查询,因为它只需要加载和处理相关的列数据,比行存储更高效。特别对于大量数据进行聚合运算(如SUM、AVG)的查询,列存储通常更快。
  • 支持高并发: 列存储在读取数据时可以仅加载需要的列,提供了更好的并发性能,更适合处理大规模数据查询。

Java 操作ClickHouse

以下使用ClickHouse提供的Java Client V2 客户端操作。

没有使用Java提供的JDBC Driver,主要是考虑可能存在部分特性不支持,后期修改成本较大,同时目前 JDBC Driver 是基于Client V1实现,后期会升级为Client V2,升级的过程可能也会带来一些变动。

配置ClickHouse

基础配置:

@ConfigurationProperties(prefix = "clickhouse")
@Data
@Configuration
public class ClickHouseProperties {private String url;private String username;private String password;private String database;
}

配置ClickHouse 客户端:

@Configuration
public class ClickHouseConfig {@Beanpublic Client chDirectClient(ClickHouseProperties chProperties) {return new Client.Builder().addEndpoint(chProperties.getUrl()).setUsername(chProperties.getUsername()).setPassword(chProperties.getPassword())// sets the maximum number of connections to the server at a time// this is important for services handling many concurrent requests to ClickHouse.setMaxConnections(100).setLZ4UncompressedBufferSize(1058576).setSocketRcvbuf(500_000).setSocketTcpNodelay(true).setSocketSndbuf(500_000).setClientNetworkBufferSize(500_000).allowBinaryReaderToReuseBuffers(true) // using buffer pool for binary reader// 开启JSON类型的支持,但是目前对于json的实现并不完善,不建议使用.serverSetting("allow_experimental_json_type", "1")// allow JSON transcoding as a string
//                .serverSetting(ServerSettings.INPUT_FORMAT_BINARY_READ_JSON_AS_STRING, "1")
//                .serverSetting(ServerSettings.OUTPUT_FORMAT_BINARY_WRITE_JSON_AS_STRING, "1").setDefaultDatabase(chProperties.getDatabase()).setConnectTimeout(10000).setSocketTimeout(10000).build();}
}

增删改查操作

package edu.whu.metadata.dao.clickhouse;import cn.hutool.core.util.StrUtil;
import com.clickhouse.client.api.Client;
import com.clickhouse.client.api.data_formats.ClickHouseBinaryFormatReader;
import com.clickhouse.client.api.insert.InsertResponse;
import com.clickhouse.client.api.insert.InsertSettings;
import com.clickhouse.client.api.internal.ServerSettings;
import com.clickhouse.client.api.metadata.TableSchema;
import com.clickhouse.client.api.metrics.ServerMetrics;
import com.clickhouse.client.api.query.QueryResponse;
import com.clickhouse.client.api.query.QuerySettings;
import com.clickhouse.data.ClickHouseFormat;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import edu.whu.metadata.entity.TrackData;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Repository;import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;import static edu.whu.metadata.entity.TrackData.TABLE_NAME;@Slf4j
@Repository
public class TrackDataDao {@Resourceprivate Client chClient;InsertSettings insertSettings = new InsertSettings();/**流式插入,可以读取csv文件流,写入clickHouse中*/public void insertStream(InputStream dataStream) {try {try (InsertResponse response = chClient.insert(TABLE_NAME, dataStream, ClickHouseFormat.JSONEachRow,insertSettings).get(1, TimeUnit.HOURS)) {log.info("Insert finished: {} rows written", response.getMetrics().getMetric(ServerMetrics.NUM_ROWS_WRITTEN).getLong());} catch (Exception e) {log.error("Failed to write JSONEachRow data", e);throw new RuntimeException(e);}} finally {try {dataStream.close();} catch (Exception e) {log.error("Failed to close data stream", e);}}}/*** 插入单条 TrackData 数据*/public void insert(TrackData trackData) {try {List<TrackData> trackDataList = List.of(trackData);chClient.insert(TABLE_NAME, trackDataList, insertSettings);log.info("Inserted TrackData with id {}", trackData.getId());} catch (Exception e) {log.error("Failed to insert TrackData", e);throw new RuntimeException(e);}}public void insertBatch(List<TrackData> trackDataList) {try {InsertResponse insertResponse = chClient.insert(TABLE_NAME, trackDataList, insertSettings).get();log.info("Inserted TrackData with id {}", insertResponse.getMetrics());} catch (Exception e) {log.error("Failed to insert TrackData", e);throw new RuntimeException(e);}}/*** 根据 id 查询数据*/public List<TrackData> findByObjectId(String id) {List<TrackData> result = new ArrayList<>();String sql = "SELECT * FROM " + TABLE_NAME + " WHERE object_id = " + id;QuerySettings querySettings = new QuerySettings();try (QueryResponse response = chClient.query(sql, querySettings).get()) {ClickHouseBinaryFormatReader reader = chClient.newBinaryFormatReader(response);while (reader.hasNext()) {reader.next();TrackData trackData = buildTrackData(reader);result.add(trackData);}} catch (Exception e) {log.error("Failed to query TrackData by id", e);throw new RuntimeException(e);}return result;}/*** 根据地理范围、时间段和 object_id 查询数据,支持分页查询*/public Page<TrackData> findByPage(Double minLatitude, Double maxLatitude,Double minLongitude, Double maxLongitude,LocalDateTime startTime, LocalDateTime endTime,String objectId, Pageable pageable) {List<TrackData> result = new ArrayList<>();// 构建基础查询语句StringBuilder sqlBuilder = new StringBuilder("SELECT * FROM " + TABLE_NAME + " WHERE 1=1");// 根据地理范围添加查询条件if (minLatitude != null && maxLatitude != null) {sqlBuilder.append(" AND latitude BETWEEN ").append(minLatitude).append(" AND ").append(maxLatitude);}if (minLongitude != null && maxLongitude != null) {sqlBuilder.append(" AND longitude BETWEEN ").append(minLongitude).append(" AND ").append(maxLongitude);}// 根据时间范围添加查询条件 将 LocalDateTime 转换为指定格式的字符串if (startTime != null && endTime != null) {DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");String formattedStartTime = startTime.format(formatter);String formattedEndTime = endTime.format(formatter);sqlBuilder.append(" AND timestamp BETWEEN '").append(formattedStartTime).append("' AND '").append(formattedEndTime).append("'");}// 根据 object_id 添加查询条件if (objectId != null) {sqlBuilder.append(" AND object_id = '").append(objectId).append("'");}// 添加分页条件sqlBuilder.append(" LIMIT ").append(pageable.getPageSize()).append(" OFFSET ").append(pageable.getOffset());String sql = sqlBuilder.toString();log.info("Generated SQL: {}", sql);// 执行查询try (QueryResponse response = chClient.query(sql).get(10, TimeUnit.SECONDS)) {TableSchema tableSchema = chClient.getTableSchema(TABLE_NAME);ClickHouseBinaryFormatReader reader = chClient.newBinaryFormatReader(response, tableSchema);while (reader.hasNext()) {reader.next();TrackData trackData = buildTrackData(reader);  // 将查询结果转换为 TrackData 对象result.add(trackData);}} catch (Exception e) {log.error("Failed to query TrackData", e);throw new RuntimeException(e);}long count = 0L;String countSql = sql.replaceFirst("SELECT \\*", "SELECT COUNT(*)");countSql = countSql.substring(0, countSql.indexOf("LIMIT"));log.info("Generated Count SQL: {}", countSql);try (QueryResponse countResponse = chClient.query(countSql).get(10, TimeUnit.SECONDS)) {TableSchema countSchema = chClient.getTableSchema(TABLE_NAME);ClickHouseBinaryFormatReader countReader = chClient.newBinaryFormatReader(countResponse, countSchema);if (countReader.hasNext()) {countReader.next();count = countReader.getLong(1);  // 获取 COUNT(*) 的结果}} catch (Exception e) {log.error("Failed to query total count", e);throw new RuntimeException(e);}return new PageImpl<>(result, pageable, count);}/*** 根据 id 删除数据*/public void deleteById(Long id) {String sql = "ALTER TABLE " + TABLE_NAME + " DELETE WHERE id = " + id;try {chClient.execute(sql);log.info("Deleted TrackData with id {}", id);} catch (Exception e) {log.error("Failed to delete TrackData", e);throw new RuntimeException(e);}}@NotNullprivate static TrackData buildTrackData(ClickHouseBinaryFormatReader reader) {TrackData trackData = new TrackData();trackData.setId(reader.getString("id"));trackData.setDataType(reader.getString("data_type"));trackData.setObjectId(reader.getString("object_id"));trackData.setTimestamp(reader.getLocalDateTime("timestamp"));trackData.setLatitude(reader.getDouble("latitude"));trackData.setLongitude(reader.getDouble("longitude"));trackData.setMetadata(reader.getString("metadata"));Float speed = StrUtil.isBlankIfStr(reader.getString("speed")) ? null : reader.getFloat("speed");trackData.setSpeed(speed);Float heading = StrUtil.isBlankIfStr(reader.getString("heading")) ? null : reader.getFloat("heading");trackData.setHeading(heading);Float altitude = StrUtil.isBlankIfStr(reader.getString("altitude")) ? null : reader.getFloat("altitude");trackData.setAltitude(altitude);return trackData;}
}

参考

  • ClickHouse 列式存储
  • 官方代码示例-github

相关文章:

ClickHouse 入门

简介 ClickHouse 是一个列式数据库&#xff0c;传统的数据库一般是按行存储&#xff0c;而ClickHouse则是按列存储&#xff0c;每一列都有自己的存储空间&#xff0c;并且只存储该列的数值&#xff0c;而不是存储整行的数据。这样做主要有几个好处&#xff0c;压缩率高&#x…...

Python自动化:基于faker批量生成模拟数据(以电商行业销售数据为例)

引言&#xff1a;个人认为&#xff0c;“造数据”是一个数据分析师的一项基本技能&#xff0c;当然啦&#xff0c;“造数据”不是说胡编乱造&#xff0c;而是根据自己的需求去构造一些模拟数据集&#xff0c;用于测试等用途&#xff0c;而且使用虚拟数据不用担心数据隐私和安全…...

3.3 OpenAI GPT-4, GPT-3.5, GPT-3 模型调用:开发者指南

OpenAI GPT-4, GPT-3.5, GPT-3 模型调用:开发者指南 OpenAI 的 GPT 系列语言模型,包括 GPT-4、GPT-3.5 和 GPT-3,已经成为自然语言处理领域的标杆。无论是文本生成、对话系统,还是自动化任务,开发者都可以通过 API 调用这些强大的模型来增强他们的应用。本文将为您详细介…...

【Spring Boot】掌握 Spring 事务:隔离级别与传播机制解读与应用

前言 &#x1f31f;&#x1f31f;本期讲解关于spring 事务传播机制介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话…...

力扣203题—— 移除链表元素

题目 递归法使用 if(headnull){return null; }//假设remove返回后面已经去掉val值的链表 我们用head.next去存放他&#xff0c;接着我们要判断此时head head值是否等于val&#xff0c;如果等于我们就返回后继元素即可 head.nextremove(head.next,val); if(head.valval){return…...

Express中间件

目录 Express中间件 中间件的概念 next函数 全局中间与局部中间件 多个中间件 中间的5个注意事项 中间的分类 应用级中间件 路由级中间件 错误级中间件 Express内置中间件 express.json express.urlencoded 第三方中间件​编辑 自定义中间件 Express中间件 中间…...

【AIGC】SYNCAMMASTER:多视角多像机的视频生成

标题&#xff1a;SYNCAMMASTER: SYNCHRONIZING MULTI-CAMERA VIDEO GENERATION FROM DIVERSE VIEWPOINTS 主页&#xff1a;https://jianhongbai.github.io/SynCamMaster/ 代码&#xff1a;https://github.com/KwaiVGI/SynCamMaster 文章目录 摘要一、引言二、使用步骤2.1 TextT…...

模块化架构与微服务架构,哪种更适合桌面软件开发?

前言 在现代软件开发中&#xff0c;架构设计扮演着至关重要的角色。两种常见的架构设计方法是模块化架构与微服务架构。它们各自有独特的优势和适用场景&#xff0c;尤其在C#桌面软件开发领域&#xff0c;模块化架构往往更加具有实践性。本文将对这两种架构进行对比&#xff0…...

Ubuntu 24.04 LTS 安装 tailscale 并访问 SMB共享文件夹

Ubuntu 24.04 LTS 安装 tailscale 安装 Tailscale 官方仓库 首先&#xff0c;确保系统包列表是最新的&#xff1a; sudo apt update接下来&#xff0c;安装 Tailscale 所需的仓库和密钥&#xff1a; curl -fsSL https://tailscale.com/install.sh | sh这会自动下载并安装 …...

fgets、scanf存字符串应用

题目1 夺旗&#xff08;英语&#xff1a;Capture the flag&#xff0c;简称 CTF&#xff09;在计算机安全中是一种活动&#xff0c;当中会将“旗子”秘密地埋藏于有目的的易受攻击的程序或网站。参赛者从其他参赛者或主办方偷去旗子。 非常崇拜探姬的小学妹最近迷上了 CTF&am…...

C#高级:用Csharp操作鼠标和键盘

一、winform 1.实时获取鼠标位置 public Form1() {InitializeComponent();InitialTime(); }private void InitialTime() {// 初始化 Timer 控件var timer new System.Windows.Forms.Timer();timer.Interval 100; // 设置为 100 毫秒&#xff0c;即每 0.1 秒更新一次timer.…...

关于AI agent的学术论文实验部分:准确率,响应时间,用户满意度

关于AI agent的学术论文实验部分 在撰写关于AI agent的学术论文时,实验设计和实施是关键部分,仅搭建完成AI agent通常是不够的,需要通过严谨的实验来验证其性能、效果和创新性。以下以一个在智能客服场景中应用AI agent的例子,说明如何完成实验: 明确实验目的:确定通过实…...

消息队列实战指南:三大MQ 与 Kafka 适用场景全解析

前言&#xff1a;在当今数字化时代&#xff0c;分布式系统和大数据处理变得愈发普遍&#xff0c;消息队列作为其中的关键组件&#xff0c;承担着系统解耦、异步通信、流量削峰等重要职责。ActiveMQ、RabbitMQ、RocketMQ 和 Kafka 作为市场上极具代表性的消息队列产品&#xff0…...

postgresql表分区及测试

本文主要采用list类型实现表分区&#xff0c;并对表分区数据进行查询对比&#xff0c;数据量6000万条以上&#xff0c;速度相差10倍以上。 一、创建表&#xff0c;以substationcode字段为ist类型表分区 CREATE TABLE "public"."d_population_partition" …...

VUE学习笔记(入门)1__创建VUE实例

核心步骤 <div id"app"><!-- 这里存放渲染逻辑代码 --><h1>{{ msg }}</h1><a href"#">{{count}}</a> </div><!-- 引入在线的开发版本核心包 --> <!-- 引入核心包后全局可使用VUE构造函数 --> <…...

STL—stack与queue

目录 Stack stack的使用 stack的模拟实现 queue queue的使用 queue的模拟实现 priority_queue priority_queue的用法 priority_queue的模拟实现 容器适配器 种类 Stack http://www.cplusplus.com/reference/stack/stack/?kwstack stack是栈&#xff0c;后入先出 stack的…...

pthread_create函数

函数原型 pthread_create 是 POSIX 线程&#xff08;pthread&#xff09;库中的一个函数&#xff0c;用于在程序中创建一个新线程。 #include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *a…...

suctf2025

Suctf2025 --2标识为看的wp&#xff0c;没环境复现了 所有参考资料将在文本末尾标明 WEB SU_photogallery 思路&#x1f447; 构造一个压缩包&#xff0c;解压出我们想解压的部分&#xff0c;然后其他部分是损坏的&#xff0c;这样是不是就可以让整个解压过程是出错的从而…...

二、点灯基础实验

嵌入式基础实验第一个就是点灯&#xff0c;地位相当于编程界的hello world。 如下为LED原理图&#xff0c;要让相应LED发光&#xff0c;需要给I/O口设置输出引脚&#xff0c;低电平&#xff0c;二极管才会导通 2.1 打开初始工程&#xff0c;编写代码 以下会实现BLINKY常亮&…...

ESP8266-01S、手机、STM32连接

1、ESP8266-01S的工作原理 1.1、AP和STA ESP8266-01S为WIFI的透传模块&#xff0c;主要模式如下图&#xff1a; 上节说到&#xff0c;我们需要用到AT固件进行局域网应用&#xff08;ESP8266连接的STM32和手机进行连接&#xff09;。 ESP8266为一个WiFi透传模块&#xff0c;和…...

微服务学习:基础理论

一、微服务和应用现代化 1、时代的浪潮&#xff0c;企业的机遇和挑战 在互联网化数字化智能化全球化的当今社会&#xff0c;IT行业也面临新的挑战&#xff1a; 【快】业务需求如“滔滔江水连绵不绝”&#xff0c;企业需要更快的交付【变】林子大了&#xff0c;百色用户&…...

【c++继承篇】--继承之道:在C++的世界中编织血脉与传承

目录 引言 一、定义二、继承定义格式2.1定义格式2.2继承关系和访问限定符2.3继承后子类访问权限 三、基类和派生类赋值转换四、继承的作用域4.1同名变量4.2同名函数 五、派生类的默认成员构造函数5.1**构造函数调用顺序&#xff1a;**5.2**析构函数调用顺序&#xff1a;**5.3调…...

Java操作Excel导入导出——POI、Hutool、EasyExcel

目录 一、POI导入导出 1.数据库导出为Excel文件 2.将Excel文件导入到数据库中 二、Hutool导入导出 1.数据库导出为Excel文件——属性名是列名 2.数据库导出为Excel文件——列名起别名 3.从Excel文件导入数据到数据库——属性名是列名 4.从Excel文件导入数据到数据库…...

基于VSCODE+GDB+GDBSERVER远程单步调试设备篇(可视化界面)

目录 说明 配置方法 1&#xff09;VSCODE必备插件 2&#xff09;配置launch.json文件&#xff0c;用于GDB调试 调试步骤 ​​​​​​目标板运行程序 1&#xff09;已启动程序&#xff0c;通过attach方式进入调试 2&#xff09;通过gdbserver启动时加载程序(程序路径根据实际情…...

【设计模式】 单例模式(单例模式哪几种实现,如何保证线程安全,反射破坏单例模式)

单例模式 作用&#xff1a;单例模式的核心是保证一个类只有一个实例&#xff0c;并且提供一个访问实例的全局访问点。 实现方式优缺点饿汉式线程安全&#xff0c;调用效率高 &#xff0c;但是不能延迟加载懒汉式线程安全&#xff0c;调用效率不高&#xff0c;能延迟加载双重检…...

lvm快照备份

前提 数据文件要在逻辑卷上&#xff1b; 此逻辑卷所在卷组必须有足够空间使用快照卷&#xff1b; 数据文件和事务日志要在同一个逻辑卷上&#xff1b; 前提&#xff1a;MySQL数据lv和将要创建的快照要在同一vg&#xff0c;vg要有足够的空间存储 优点 几乎是热备&…...

PHP CRM售后系统小程序

&#x1f4bc; CRM售后系统 &#x1f4fa;这是一款基于PHP和uniapp深度定制的CRM售后管理系统&#xff0c;它犹如企业的智慧核心&#xff0c;精准赋能销售与售后管理的每一个环节&#xff0c;引领企业步入精细化、数字化的全新管理时代。系统集成了客户管理、合同管理、工单调…...

ETL 数据抽取

ETL ETL 数据抽取 ETL&#xff08;Extract, Transform, Load&#xff09;是数据集成和处理的重要过程&#xff0c;其中数据抽取&#xff08;Extract&#xff09;是第一步&#xff0c;负责从各种数据源中提取数据。以下是ETL数据抽取的详细说明和常用工具&#xff1a; 1. 数据…...

FANUC机器人系统镜像备份与恢复的具体步骤(图文)

FANUC机器人系统镜像备份与恢复的具体步骤(图文) 镜像备份: 如下图所示,进入文件—工具—切换设备,找到插入的U盘UT1, 如下图所示,进入U盘目录后,创建目录,这里目录名称为11, 如下图所示࿰...

MindsDB - 构建企业数据源 AI 对话

一、关于 MindsDB MindsDB是世界上最有效的解决方案&#xff0c;用于构建与混乱的企业数据源对话的AI应用程序。把它想象成图书管理员Marie Kondo。 github : https://github.com/mindsdb/mindsdb官网&#xff1a;https://www.mindsdb.com/官方文档&#xff1a;https://docs.…...

正则表达式(python版最全面,最易懂)

正则表达式 正则表达式英文称regular expression 定义&#xff1a;正则表达式是一种文本模式匹配的工具&#xff0c;用于字符串的搜索&#xff0c;匹配和替换。在excel,word以及其他的文本编辑器都可直接适配。 一、基本匹配规则 字面值字符&#xff1a;例如字母、数字、空格…...

QT 使用QTableView读取数据库数据,表格分页,跳转,导出,过滤功能

文章目录 效果图概述功能点代码分析导航栏表格更新视图表格导出表格过滤 总结 效果图 概述 本案例用于对数据库中的数据进行显示等其他操作。数据库的映射&#xff0c;插入等功能看此博客框架&#xff1a;数据模型使用QSqlTableModel&#xff0c;视图使用QTableView&#xff0…...

golang标准库path/filepath使用示例

文章目录 前言一、常用方法示例1.将相对路径转换为绝对路径2.获取路径中最后一个元素3.获取路径中除去最后一个元素的部分4.路径拼接5.将路径拆分为目录和文件名两部分6.返回一个相对路径7.文件路径遍历8.根据文件扩展名过滤文件9.使用正则表达式进行路径匹配 前言 path/filep…...

【日志篇】(7.6) ❀ 01. 在macOS下刷新FortiAnalyzer固件 ❀ FortiAnalyzer 日志分析

【简介】FortiAnalyzer 是 Fortinet Security Fabric 安全架构的基础&#xff0c;提供集中日志记录和分析&#xff0c;以及端到端可见性。因此&#xff0c;分析师可以更有效地管理安全状态&#xff0c;将安全流程自动化&#xff0c;并快速响应威胁。具有分析和自动化功能的集成…...

12 分布式事务

分布式事务产生的原因 我们拿mysql数据库来说&#xff0c;当数据库为单体数据库的时候&#xff0c;我们打开事务&#xff0c;执行sql为预执行阶段&#xff0c;最后commit时通过日志控制最终全部提交后存储到磁盘中&#xff0c;如果commit失败&#xff0c;可以通过日志控制回滚…...

移远通信多模卫星通信模组BG95-S5获得Skylo网络认证,进一步拓展全球卫星物联网市场

近日&#xff0c;全球领先的物联网整体解决方案供应商移远通信正式宣布&#xff0c;其支持“卫星蜂窝”多模式的高集成度NTN卫星通信模组BG95-S5已成功获得NTN网络运营商Skylo的网络认证。BG95-S5也成为了获得该认证的最新款移远卫星通信模组。 BG95-S5模组顺利获得Skylo认证&a…...

51.WPF应用加图标指南 C#例子 WPF例子

完整步骤&#xff1a; 先使用文心一言生成一个图标如左边使用Windows图片编辑器编辑&#xff0c;去除背景使用正方形&#xff0c;放大图片使图标铺满图片使用格式工程转换为ico格式&#xff0c;分辨率为最大 在资源管理器中右键项目添加ico类型图片到项目里图片属性设置为始终…...

OpenEuler学习笔记(三):为什么要搞OpenEuler?

为什么要搞OpenEuler&#xff1f; 技术自主可控需求 在信息技术领域&#xff0c;操作系统是关键的基础软件。过去&#xff0c;很多关键技术被国外厂商掌控&#xff0c;存在技术“卡脖子”的风险。OpenEuler的出现可以为国内提供一个自主可控的操作系统选择。例如&#xff0c;在…...

Apache Hive--排序函数解析

在大数据处理与分析中&#xff0c;Apache Hive是一个至关重要的数据仓库工具。其丰富的函数库为数据处理提供了诸多便利&#xff0c;排序函数便是其中一类非常实用的工具。通过排序函数&#xff0c;我们能够在查询结果集中为每一行数据分配一个排名值&#xff0c;这对于数据分析…...

LLMs之Dataset:中文互联网基础语料2.0的简介、下载和使用方法、案例应用之详细攻略

LLMs之Dataset&#xff1a;中文互联网基础语料2.0的简介、下载和使用方法、案例应用之详细攻略 目录 中文互联网基础语料2.0的简介 1、特点 中文互联网基础语料2.0的下载和使用方法 中文互联网基础语料2.0的案例应用 中文互联网基础语料2.0的简介 2025年1月发布&#xff0…...

深入剖析iOS网络优化策略,提升App性能

一、引言 在当今移动互联网时代&#xff0c;iOS 应用的网络性能直接关系到用户体验。无论是加载速度缓慢、频繁的网络错误&#xff0c;还是高额的流量消耗&#xff0c;都可能导致用户流失。因此&#xff0c;iOS 网络优化成为开发者提升应用质量、增强用户满意度的关键环节。本文…...

unity2022以上导出到AndroidStudio后更新步骤

1、unity里面Export出unityLibrary 2、导出apk&#xff0c;里面才包含libil2cpp(新版unity无法直接导出libil2cpp 3、注释AS项目app下的build.gradle里面包含unityLibrary的代码 4、注释AS项目settings.gradle包含unityLibrary的代码 5、删除AS项目里面的unityLibrary文件夹 6、…...

03JavaWeb——Ajax-Vue-Element(项目实战)

1 Ajax 1.1 Ajax介绍 1.1.1 Ajax概述 我们前端页面中的数据&#xff0c;如下图所示的表格中的学生信息&#xff0c;应该来自于后台&#xff0c;那么我们的后台和前端是互不影响的2个程序&#xff0c;那么我们前端应该如何从后台获取数据呢&#xff1f;因为是2个程序&#xf…...

表单中在不设置required的情况下在label前加*必填标识

参考:https://blog.csdn.net/qq_55798464/article/details/136233718 需求&#xff1a;在发票类型前面添加*必填标识 我最开始直接给发票类型这个表单类型添加了验证规则required:true&#xff0c;问题来了&#xff0c;这个发票类型它是有默认值的&#xff0c;所以我点击保存…...

Mac 使用 GVM 管理多版本 Go 环境

使用 GVM 管理多版本 Go 环境 在本文中&#xff0c;我们将使用 gvm&#xff08;Go Version Manager&#xff09;工具管理本地多个 Go 语言版本。gvm 功能类似于 Python 的 Anaconda&#xff0c;可以方便地切换不同版本的 Go 环境&#xff0c;非常适合需要多版本开发与测试的场…...

3DsMax设置中文界面

按键盘上的“Win”键&#xff0c;直接输入3dsmax&#xff0c;选择Simplified Chinese打开&#xff0c;之后就都是中文了...

【PyCharm】连接 Git

【PyCharm】相关链接 【PyCharm】连接 Git【PyCharm】连接Jupyter Notebook【PyCharm】快捷键使用【PyCharm】远程连接Linux服务器【PyCharm】设置为中文界面 要在 PyCharm 中连接 Git&#xff0c;确保您的开发环境已经安装了 Git&#xff0c;并且 PyCharm 能够访问它。 以下…...

使用Python和PIL裁剪图片以适应屏幕宽高比

在本教程中&#xff0c;我们将介绍如何使用Python和PIL&#xff08;Python Imaging Library&#xff09;库来裁剪图片&#xff0c;使其适应特定的屏幕宽高比。我们将详细解释代码的每个部分&#xff0c;并展示如何根据不同的裁剪模式来调整图片。 1. 安装PIL库 首先&#xff…...

Django简介与虚拟环境安装Django

目录 1.Django简介 1.1 Django 的核心特点 1.2 Django 的核心组件 1.3 Django 的应用场景 1.4 总结 2.基础环境建立 2.1 创建虚拟环境 2.1.1 使用 virtualenv 创建虚拟环境 2.1.2 使用 venv 创建虚拟环境 2.2 激活虚拟环境 2.2.1 在 Windows 上 2.2.2 在 macOS 或 …...

python实现pdf转word和excel

一、引言   在办公中&#xff0c;我们经常遇收到pdf文件格式&#xff0c;因为pdf格式文件不易修改&#xff0c;当我们需要编辑这些pdf文件时&#xff0c;经常需要开通会员或收费功能才能使用编辑功能。今天&#xff0c;我要和大家分享的&#xff0c;是如何使用python编程实现…...