SpringBoot使用EasyExcel批量导出500万数据

news2024/11/25 8:22:51

SpringBoot使用EasyExcel批量导出500万数据

  • 说明
  • excel版本比较
  • EasyExcel介绍
  • 项目目录
  • mysql对应表建表语句
  • pom.xml
  • application.yml配置类
  • 启动类代码
  • OrderInfo 实体类
  • OrderInfoExcel excel模版标题类(EasyExcel需要使用这个)
  • TestController控制层
  • 接口层TestService
  • TestServiceImpl实现层
  • TestDao数据接口层
  • dao层对应mapper.xml自定义sql语句
  • 测试结果如下

说明

记录下学习SpringBoot使用EasyExcel批量导出百万数据。留着以后备用。
本地环境mysql安装的5.7版本,项目使用jdk1.8版本,项目使用的mysql驱动版本为8.0版本。
这一篇博客内容代码基于我的这篇博客:
SpringBoot使用mybatis批量新增500万数据到mysql数据库Demo,在自己这篇博客的代码上做改动写批量导出功能。

excel版本比较

03版excel:HSSFWorkbook为2003之前的版本,扩展名为.xls。每个sheet页最多65536行,最大列数是256列。当应用场景数据小于65536行数据时,可以使用03版excel来导出,导出性能很高。

07版excel:XSSFWorkbook为2007之后的版本,扩展名为.xlsx。每个sheet页最多1048576行,超过这个行数,导出的时候后端程序就会抛异常。

当数据量超过65536行进行大数据量导出时可以用07版excel,当用POI进行百万数据导出时,会很占用内存,很有可能导致程序出现OOM(内存溢出),而且为了让XSSFWorkbook效率提升,用了Workbook第三个实现类SXSSFWorkbook。SXSSFWorkbook用来处理大数据量以及超大数据量的导出,只是 SXSSFWorkbook只支持.xlsx格式,不支持.xls格式。

EasyExcel介绍

EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。
它能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。

easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便。

EasyExcel官方文档:https://easyexcel.opensource.alibaba.com/

项目目录

在这里插入图片描述

mysql对应表建表语句

CREATE TABLE `order_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `period` int(11) NOT NULL COMMENT '账期月份',
  `amount` decimal(20,2) NOT NULL COMMENT '金额',
  `user_name` varchar(20) NOT NULL COMMENT '下单人',
  `phone` varchar(11) NOT NULL COMMENT '手机号',
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `creator` varchar(20) NOT NULL COMMENT '创建人',
  `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `modifier` varchar(20) NOT NULL COMMENT '修改人',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_period` (`period`),
  KEY `idx_modified` (`modified`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='订单信息表';

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>batching</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>batching</name>
    <description>batching</description>
    <properties>
        <java.version>1.8</java.version>
        <!--下列版本都是2022/04/16最新版本,都是父项目的基本依赖,用来子项目继承父项目依赖-->
        <pagehelper-starter.version>1.4.2</pagehelper-starter.version>
        <mybatis.version>3.5.9</mybatis.version>
        <mysql-connector.version>8.0.28</mysql-connector.version>
        <druid.version>1.2.9</druid.version>
        <lombok.version>1.18.22</lombok.version>
        <easyexcel.version>3.2.1</easyexcel.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--MyBatis分页插件1.4.2版本才支持spring-boot2.6.6-->
        <!--pagehelper分页官网:https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter/-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>${pagehelper-starter.version}</version>
        </dependency>
        <!-- MyBatis就是用来创建数据库连接进行增删改查等操作,提供了原生JDBC,Connection,Statement,ResultSet这些底层-->
        <!-- MyBatis官网:https://mybatis.org/mybatis-3/zh/dependency-info.html-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <!--Mysql数据库驱动-->
        <!--Mysql驱动官网:https://mvnrepository.com/artifact/mysql/mysql-connector-java/-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector.version}</version>
        </dependency>
        <!--集成druid连接池-->
        <!--druid版本官网:https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--lombok-->
        <!--lombok官网:https://mvnrepository.com/artifact/org.projectlombok/lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
        <!--集成阿里巴巴EasyExcel用于大批量数据导出-->
        <!--官网地址:https://easyexcel.opensource.alibaba.com/-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>${easyexcel.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

application.yml配置类

server:
  port: 8080

mybatis:
  mapper-locations:
    - classpath:mapper/*.xml #找到mybatis位置,自定义sql语句
  #当查询语句中resultType="java.util.HashMap"时,如果返回的字段值为null时,设置如下参数为true,让它返回
  configuration:
    call-setters-on-nulls: true

#打印sql语句
logging:
  level:
    com.example.batching.dao: debug

spring:
  datasource:
    #mysql批量新增需要在url后面添加rewriteBatchedStatements=true才能生效
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
    driverClassName: com.mysql.cj.jdbc.Driver #mysql8.0驱动,mysql5.7驱动是com.mysql.jdbc.Driver
    username: 你自己的数据库用户名
    password: 你自己的数据库密码
    druid:
      initial-size: 3 #连接池初始大小
      min-idle: 5 #最小空闲连接数
      max-active: 20 #最大空闲连接数
      web-stat-filter:
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" #不统计这些请求数据
      stat-view-servlet: #访问监控网页的用户名和密码
        #默认为true,内置监控页面首页/druid/index.html
        enabled: true
        login-username: druid
        login-password: druid


启动类代码

package com.example.batching;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class BatchingApplication {

    public static void main(String[] args) {
        SpringApplication.run(BatchingApplication.class, args);
    }

}

OrderInfo 实体类

package com.example.batching.entity;

import lombok.Data;

import java.math.BigDecimal;

@Data
public class OrderInfo {
    private int id;
    private int period;//账期月份
    private BigDecimal amount;//金额
    private String userName;//下单人
    private String phone;//手机号
    private String created;//创建时间
    private String creator;//创建人
    private String modified;//修改时间
    private String modifier;//修改人
    private int pageNum;//页数
    private int pageSize;//每页所返回行数
}

OrderInfoExcel excel模版标题类(EasyExcel需要使用这个)

package com.example.batching.excelmode;

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;

import java.math.BigDecimal;

public class OrderInfoExcel {
    @ExcelProperty(value="id")
    private int id;
    @ExcelProperty(value="账期月份")
    private int period;//账期月份
    @ExcelProperty(value="金额")
    private BigDecimal amount;//金额
    @ExcelProperty(value="下单人")
    private String userName;//下单人
    @ExcelProperty(value="手机号")
    private String phone;//手机号
    @ExcelProperty(value="创建时间")
    private String created;//创建时间
    @ExcelProperty(value="创建人")
    private String creator;//创建人
    @ExcelProperty(value="修改时间")
    private String modified;//修改时间
    @ExcelProperty(value="修改人")
    private String modifier;//修改人
    @ExcelIgnore
    private int pageNum;//页数
    @ExcelIgnore
    private int pageSize;//每页所返回行数
}

TestController控制层

批量导出方法看batchExport方法。

package com.example.batching.controller;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.example.batching.entity.OrderInfo;
import com.example.batching.excelmode.OrderInfoExcel;
import com.example.batching.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping(value = "/order")
public class TestController {

    @Autowired
    private TestService testService;

    //批量新增数据处理
    @PostMapping(value = "/batchSave")
    public String batchSave() {
        //随机生成电话号码
        String[] start = {"130", "131", "132", "133", "134", "150", "151", "155", "158", "166", "180", "181", "184", "185", "188"};
        List<OrderInfo> orderInfoList=new ArrayList<>();
        //生成500万数据批量新增到mysql数据库里面
        for(int i=1;i<=5000000;i++){
            OrderInfo orderInfo=new OrderInfo();
            orderInfo.setPeriod(202206);
            orderInfo.setAmount(new BigDecimal(i));
            orderInfo.setUserName("用户"+i);
            orderInfo.setPhone(start[(int) (Math.random() * start.length)]+(10000000+(int)(Math.random()*(99999999-10000000+1))));
            orderInfo.setCreator("用户"+i);
            orderInfo.setModifier("用户"+i);
            orderInfoList.add(orderInfo);
            //每一万条数据进行批量新增
            if(i%10000==0){
                testService.batchSave(orderInfoList);
                //新增完成后清空list集合防止内存溢出
                orderInfoList.clear();
                System.out.println("当前已新增完数据:"+i+"行");
            }
        }
        return "成功";
    }

    //批量导出数据到excel
    @GetMapping(value = "/batchExport")
    public void batchExport(HttpServletResponse response) {

        try{
            OutputStream outputStream =response.getOutputStream();
            //查询出总数据量大小,这里为500万
            int count=testService.batchExportCount();
            System.out.println("count="+count);
            //根据总数得到总页数
            int totalPage=(count-1)/100000+1;//总页数,每页10万行数据
            System.out.println("totalPage="+totalPage);
            //xlsx每个sheet页最大数据行为1048576,超过这个数值就会报错,所以这里将500万数据分5个导出到5个sheet页
            //根据总数得到每页sheet应该分几个sheet,每个sheet导入100万数据,500万就是5个sheet
            int totalSheet=(count-1)/1000000+1;//总sheet页数,每个sheet100万行数据
            System.out.println("totalSheet="+totalSheet);
            //设置初始页数
            OrderInfo orderInfo=new OrderInfo();
            orderInfo.setPageNum(0);//初始页,从0开始
            orderInfo.setPageSize(100000);//每页返回数据
            //文件名
            String fileName="批量测试导出.xlsx";
            //使用EasyExcel进行导出
            ExcelWriter excelWriter = EasyExcel.write(outputStream, OrderInfoExcel.class).build();
            //这里最终会写到5个sheet里面
            for (int i = 0; i < totalSheet; i++) {
                //writerSheet第一个参数表示往几个sheet开始写数据,从0开始表示第一个
                WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).build();
                //分页去数据库查询数据
                for(int j = orderInfo.getPageNum(); j < totalPage; j++){
                    //页数,对应后端数据库来说是索引
                    int pageNum=j*100000;
                    //每页要查询的行数
                    int pageSize=orderInfo.getPageSize();
                    //根据分页参数去查询每页数据
                    List<OrderInfo> data = testService.batchExport(pageNum,pageSize);
                    excelWriter.write(data, writeSheet);
                    System.out.println("已导出数据:"+(pageNum+100000));
                    if((pageNum+100000)%1000000==0){
                        //记录当前页数j并加1,并跳出这个for循环,往下一个sheet页写入数据
                        orderInfo.setPageNum(j+1);
                        break;
                    }
                }
            }
            //下载
            response.reset();
            response.setContentType("application/octet-stream; charset=utf-8");//以流的形式对文件进行下载
            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));//对文件名编码,防止文件名乱码
            excelWriter.finish();
            outputStream.flush();
            outputStream.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

接口层TestService

package com.example.batching.service;

import com.example.batching.entity.OrderInfo;

import java.util.List;

public interface TestService {
    void batchSave(List<OrderInfo> orderInfoList);

    int batchExportCount();

    List<OrderInfo> batchExport(int pageNum, int pageSize);
}

TestServiceImpl实现层

package com.example.batching.service.impl;

import com.example.batching.dao.TestDao;
import com.example.batching.entity.OrderInfo;
import com.example.batching.service.TestService;
import com.github.pagehelper.PageHelper;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
public class TestServiceImpl implements TestService {

    @Resource
    private TestDao testDao;

    @Resource
    private SqlSessionFactory sqlSessionFactory;

    @Override
    public void batchSave(List<OrderInfo> orderInfoList) {
        //批量新增处理,需要在jdbc连接那里添加rewriteBatchedStatements=true属性,批量新增才能生效
        // ExecutorType.SIMPLE: 这个执行器类型不做特殊的事情。它为每个语句的执行创建一个新的预处理语句。自动提交不关闭的前提下,默认设置是这个
        // ExecutorType.REUSE: 这个执行器类型会复用预处理语句。
        // ExecutorType.BATCH: 这个执行器会批量执行所有更新语句,如果 SELECT 在它们中间执行还会标定它们是 必须的,来保证一个简单并易于理解的行为。
        //如果自动提交设置为true,将无法控制提交的条数,改为最后统一提交
        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
        try {
            TestDao testMapper = sqlSession.getMapper(TestDao.class);
            orderInfoList.stream().forEach(orderInfo -> testMapper.batchSave(orderInfo));
            //提交数据
            sqlSession.commit();
        } catch (Exception e) {
            sqlSession.rollback();
        } finally {
            sqlSession.close();
        }
    }

    @Override
    public int batchExportCount() {
        return testDao.batchExportCount();
    }

    @Override
    public List<OrderInfo> batchExport(int pageNum, int pageSize) {
        return testDao.batchExport(pageNum, pageSize);
    }
}

TestDao数据接口层

package com.example.batching.dao;

import com.example.batching.entity.OrderInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface TestDao {
    void batchSave(OrderInfo orderInfo);

    int batchExportCount();

    List<OrderInfo> batchExport(@Param("pageNum") int pageNum, @Param("pageSize") int pageSize);
}

dao层对应mapper.xml自定义sql语句

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace必须指向Dao接口 -->
<mapper namespace="com.example.batching.dao.TestDao">

    <insert id="batchSave" parameterType="com.example.batching.entity.OrderInfo">
        INSERT INTO order_info
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="period != null">
                period,
            </if>
            <if test="amount != null">
                amount,
            </if>
            <if test="userName != null">
                user_name,
            </if>
            <if test="phone != null">
                phone,
            </if>
            <if test="creator != null">
                creator,
            </if>
            <if test="modifier != null">
                modifier,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="period != null">
                #{period},
            </if>
            <if test="amount != null">
                #{amount},
            </if>
            <if test="userName != null">
                #{userName},
            </if>
            <if test="phone != null">
                #{phone},
            </if>
            <if test="creator != null">
                #{creator},
            </if>
            <if test="modifier != null">
                #{modifier},
            </if>
        </trim>
    </insert>

    <select id="batchExportCount" resultType="java.lang.Integer">
        select count(id) num from order_info
    </select>

    <select id="batchExport" parameterType="java.lang.Integer" resultType="com.example.batching.entity.OrderInfo">
        select id,period,amount,user_name userName,phone,created,creator,modified,modifier
        from order_info
        order by id
        limit #{pageNum},#{pageSize}
    </select>
</mapper>

测试结果如下

浏览器调用接口返回如下:
在这里插入图片描述
后台控制台打印如下:
在这里插入图片描述
越往后进行深翻页,查询耗时越长
在这里插入图片描述
从22时33分01秒到22时36分52秒耗时接近4分钟才将所有数据进行导出。
所以这里的性能瓶颈在sql优化那一块,怎么才能深翻页的时候提高sql性能,让500万
数据更快导出。

excel文件结果如下:
id自增从1到5000000,每个sheet页100万数据。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

L298N模块驱动2项4线步进电机的多种方法及其优缺点

摘要&#xff1a;本文将详细介绍L298N模块驱动2项4线步进电机的多种方法&#xff0c;并分析各种方法的优缺点。在实例程序中&#xff0c;将展示不同方法的代码示例&#xff0c;帮助读者理解并实际应用。 引言&#xff1a; 步进电机作为一种常用的电机类型&#xff0c;在许多嵌入…

估值 2 个月从 11 亿美元降到 3 亿美元,投资人清仓跑路,国产大模型创业遇冷...

图片来源&#xff1a;由无界 AI生成 创业未半&#xff0c;而中道崩殂。 6 月 29 日&#xff0c;美团发布公告以 20.65 亿元全资收购光年之外全部权益&#xff0c;距离光年之外正式营业刚过去 84 天。 这是目前中国大模型创业领域最大的收购案&#xff0c;光年之外也在 4 个月时…

HTML5 游戏开发实战 | 黑白棋

黑白棋&#xff0c;又叫反棋(Reversi)、奥赛罗棋(Othello)、苹果棋、翻转棋。黑白棋在西方和日本很流行。游戏通过相互翻转对方的棋子&#xff0c;最后以棋盘上谁的棋子多来判断胜负。黑白棋的棋盘是一个有88方格的棋盘。开始时在棋盘正中有两白两黑四个棋子交叉放置&#xff0…

观察级水下机器人第一次使用总结2023年6月

最近有个科研项目需要用到ROV&#xff0c;其合同三年之前就签订了&#xff0c;由于疫情的影响&#xff0c;一直没有执行。刚好我们的ROV也验收了&#xff0c;正好派上用场。因为属于ROV使用的菜鸟级&#xff0c;我们邀请厂家无锡智海张工和陈工&#xff0c;中海辉固ROV操作经验…

纵向越权-业务安全测试实操(32)

纵向越权 某办公系统普通用户权限越权提升为系统权限 服务器为鉴别客户端浏览器会话及身份信息,会将用户身份信息存储在 Cookie中, 并发送至客户端存储。攻击者通过尝试修改Cookie中的身份标识为管理员,欺骗服务器分 配管理员权限,达到垂直越权的目的,如图所示。 某办公系…

「原汤话原食」更名「记者下班」,一切才刚刚开始

大家好&#xff0c;我是《原汤话原食》的小黑。这可能是我最后一次这样介绍自己。 毕竟&#xff0c;以后&#xff0c;我就得说&#xff0c;我是《记者下班》的小黑了。 事情是这样的&#xff1a; 2023年7月5日&#xff0c;津津乐道播客网络旗下《原汤话原食》节目正式更名为《记…

Claude使用教程,解决Claude不能回复

Claude是ChatGPT最为有⼒的竞争对⼿之⼀&#xff0c;Claude 的研发公司是专注人工智能安全和研究的初创公司 Anthropic&#xff0c;由前 OpenAI 员工共同创立的。今年 3 月份 Anthropic 获得了谷歌 3 亿美元的投资&#xff0c;谷歌也因此获得其 10% 股份。 ⽬前可以通过官⽹加…

day29-Oracle

0目录 第一章 Oracle 1.1 Oracle表空间-创建&#xff1a; 1.2 Oracle表空间-删除&#xff1a; 1.3 Oracle常用用户&#xff08;内置&#xff09;&#xff1a;&#xff08;1&#xff09;sys 超级用户&#xff1a; 定义&#xff1a;它是Oracle中的超级账户&#xff0…

百度算法提前批 面试复盘

作者 | liu_sy 面试锦囊之面经分享系列&#xff0c;持续更新中 欢迎后台回复"面试"加入讨论组交流噢 写在前面 之前通过非定向内推提前批&#xff0c;简历一直处于筛选状态中&#xff0c;然后大概在牛客看到一个前辈所在部门&#xff08;推荐搜索&#xff09;招人&…

【docker】在windows下配置linux深度学习环境并开启ssh远程连接

liunux下配置深度学习程序方便&#xff0c;windows下用起来更习惯。 windows下直接利用虚拟机是不太容易对GPU进行虚拟&#xff0c;利用docker就可以。这里简单介绍了在win主机下如利用docker&#xff0c;配置虚拟机环境&#xff0c;并和主机开启ssh连接配置。 配置与系统要求…

Delta数据湖upsert调优---1000多列表的调优

背景 本文基于 spark 3.1.1 delta 1.0.0 目前在我们公司遇到了一个任务写delta&#xff08;主要是的upsert操作&#xff09;&#xff0c;写入的时间超过了6个小时&#xff0c;该spark主要的做的事情是&#xff1a; 一行数据变几百行开窗函数去重调用pivot函数 行列的转换&…

Linux 串口工具minicom

Linux minicom Linux中的Minicom是一个串口通信工具&#xff0c;用于与外部设备进行串口通信。它可以用于与嵌入式设备、调试设备、网络设备等进行通信和配置。 调试和配置串口设备&#xff1a;minicom可以用于连接和调试各种串口设备&#xff0c;如调制解调器、路由器、交换…

软件DevOps云化发展的趋势 【课程限时免费】

你了解什么是DevOps吗&#xff1f; 它是怎么诞生的&#xff1f; DevOps能做些什么&#xff1f; 相信对于DevOps的实践者和关注者来说&#xff0c;对它已经不陌生了&#xff0c;但是对于刚刚进入开发者领域不久的小伙伴应该并不清楚&#xff0c;下面就让小智带你一起了解DevO…

node初识

一、什么是node node官网&#xff1a;https://nodejs.cn/ Node.js是一个开源的、跨平台的JavaScript运行环境。它基于Chrome V8 JavaScript引擎&#xff0c;使得JavaScript可以在服务器端运行。Node.js具有事件驱动、非阻塞式I/O的特性&#xff0c;适用于开发高性能的网络应…

ue4_Dota总结 GameMode篇

一&#xff1a;框架设计 新建地图M01&#xff1b; 创建gamemode&#xff1b; 创建gamestate&#xff1b; 创建playercontroller&#xff1b; 创建hud&#xff1b; 创建pawn&#xff1b; 将gamemode设置为M01地图中&#xff1b;将gamestate/playercontroller/hud/pawn添加…

SourceTree 切换分支时提示框 OpenSSH助手验证失败

问题描述&#xff1a; 这是我找的别的图&#xff0c;我自己的图忘记截了&#xff0c;大概意思差不多&#xff0c;就是服务器验证失败&#xff1a; 解决办法 &#xff1a;以下3步 1、命令行输入 ssh-keygen 然后一直下一步&#xff0c;直到结束&#xff0c;密钥和公钥会…

Dbeaver 往s4 HANA自建表 导入数据

今天有一份数据 13W行 需要导入S4 自建表。本来搞了一个通用的自建表导入程序&#xff0c;无奈13W行的数据就是无法读取&#xff0c;200行倒是可以。 那非常时期&#xff0c;用非常手段&#xff0c;尝试了一下刺激&#xff0c;dbeaver 导入到S4 HANA数据 后面试一下&#xff…

【运维工程师学习】磁盘相关知识——磁盘、柱面、磁道、磁头、扇区、格式化

【运维工程师学习】磁盘 1、DOS&#xff08;Disk Operating System&#xff09;2、硬盘坏道(1)逻辑坏道(2)物理坏道(3)检查坏道(4)原因(5)修复修复逻辑坏道用Scandisk检查用软件隐藏物理坏道低级格式化修复坏道 3、柱面4、扇区5、磁道6、数据区(1)数据区的内容(2)数据区根目录分…

logstash过滤器插件--translate

logstash过滤器之translate 官方手册&#xff1a;https://www.elastic.co/guide/en/logstash/current/plugins-filters-translate.html#plugins-filters-translate-target 功能描述 translate过滤器插件用于根据字典或查找文件过滤传入数据中的特定字段&#xff0c;如果输入…

【Layui】图标选择器 iconPicker 的使用

【Layui】图标选择器 iconPicker 的使用 1.项目前言2.项目目标3.项目实现3.1 图标读取3.2 图标擦除 4.效果展示4.1 简单使用4.2 参数配置4.3 使用 unicode 5.源码地址 系统&#xff1a;Win10 JDK&#xff1a;1.8.0_333 IDEA&#xff1a;2022.3.3 SpringBoot&#xff1a;2.7.6 L…