DorisStreamLoader工具类

<?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> <!-- SpringBoot 父工程 必须带,版本统一管理核心,版本号建议固定2.7.18 稳定版 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.18</version> <relativePath/> </parent> <groupId>com.example</groupId> <artifactId>demo-project</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo-project</name> <description>SpringBoot Project</description> <!-- JDK版本指定 1.8 --> <properties> <java.version>1.8</java.version> </properties> <!-- 代码所需全部依赖【都带版本号】 --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.7.18</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.5</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-util</artifactId> <version>9.0.80</version> </dependency> </dependencies> <!-- SpringBoot打包插件,必须带,打包可执行jar包 --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.7.18</version> </plugin> </plugins> </build> </project>
package com.example.demo.util; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import org.apache.http.HttpHeaders; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPut; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.DefaultRedirectStrategy; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.apache.tomcat.util.codec.binary.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.*; /** * @author qushen * @create 2023/6/22 19:41:08 */ @Component public class DorisStreamLoader { private final Logger log = LoggerFactory.getLogger(DorisStreamLoader.class); /** * 用户名 */ @Value("${spring.datasource.doris.username}") private String user ; /** * 密码 */ @Value("${spring.datasource.doris.password}") private String password; /** * doris stream load url */ @Value("${spring.datasource.doris.loadUrl}") private String loadUrl ; private ObjectMapper objectMapper = new ObjectMapper(); { objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); objectMapper.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); objectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_INDEX, true); } /** * 构建http客户端 */ final HttpClientBuilder httpClientBuilder = HttpClients .custom() .setRedirectStrategy(new DefaultRedirectStrategy() { @Override protected boolean isRedirectable(String method) { return true; } }); /** * JSON格式的数据导入 * @param content String * @throws Exception Exception */ public void loadJson(String table,List<Map<String,Object>> datas,Map<String,String> defaultValue) throws Exception { try (CloseableHttpClient client = httpClientBuilder.build()) { String fullLoadUrl = String.format(loadUrl,table); HttpPut httpPut = new HttpPut(fullLoadUrl); httpPut.removeHeaders(HttpHeaders.CONTENT_LENGTH); httpPut.removeHeaders(HttpHeaders.TRANSFER_ENCODING); httpPut.setHeader(HttpHeaders.EXPECT, "100-continue"); httpPut.setHeader(HttpHeaders.AUTHORIZATION, basicAuthHeader(user, password)); httpPut.setHeader("Content-Type", "application/json;charset=UTF-8"); // You can set stream load related properties in the Header, here we set label and column_separator. httpPut.setHeader("column_separator", ","); httpPut.setHeader("format", "json"); httpPut.setHeader("strip_outer_array", "true"); httpPut.setHeader("line_delimiter", "\\x02"); httpPut.setHeader("two_phase_commit", "false"); httpPut.setHeader("strict_mode", "true"); // Set up the import file. Here you can also use StringEntity to transfer arbitrary data. ArrayNode arrayNode = objectMapper.createArrayNode(); int[] se = new int[]{0,0}; for ( int i = 0;i < datas.size(); i++) { Map<String, Object> stringObjectMap = datas.get(i); ObjectNode objectNode = objectMapper.createObjectNode(); for (Map.Entry<String, Object> stringObjectEntry : stringObjectMap.entrySet()) { objectNode.putPOJO(stringObjectEntry.getKey().toLowerCase(),stringObjectEntry.getValue()); } objectNode.putPOJO("sjcrsj",new Date()); arrayNode.add(objectNode); if ((i+1)%5000 == 0) { sendData(client, httpPut,objectMapper.writeValueAsString(arrayNode),se); arrayNode.removeAll(); } } if (!arrayNode.isEmpty()) { sendData(client, httpPut,objectMapper.writeValueAsString(arrayNode),se); } log.info("数据总数:{},成功数:{},失败数:{}",datas.size(),se[0],se[1]); } } private void sendData(CloseableHttpClient client, HttpPut httpPut,String data,int[] se) throws IOException { StringEntity entity = new StringEntity(data, "UTF-8"); httpPut.setEntity(entity); httpPut.setHeader("label", UUID.randomUUID().toString()); try (CloseableHttpResponse response = client.execute(httpPut)) { String loadResult = ""; if (response.getEntity() != null) { loadResult = EntityUtils.toString(response.getEntity()); } final int statusCode = response.getStatusLine().getStatusCode(); if (statusCode != 200) { throw new IOException(String.format("Stream load failed. status: %s load result: %s", statusCode, loadResult)); } JsonNode jsonNode = objectMapper.readTree(loadResult); String status = jsonNode.get("Status").asText(); if ("Fail".equals(status)) { throw new IOException("导入doris失败:"+loadResult); } else if ("Label Already Exists".equals(status)) { } int numberTotalRows = jsonNode.get("NumberTotalRows").asInt(); int numberLoadedRows = jsonNode.get("NumberLoadedRows").asInt(); int numberFilteredRows = jsonNode.get("NumberFilteredRows").asInt(); se[0] += numberLoadedRows; se[1] += numberFilteredRows; } catch (Exception e) { log.error("写入doris失败",e); } } /** * 封装认证信息 * @param username String * @param password String * @return String */ private static String basicAuthHeader(String username, String password) { final String tobeEncode = username + ":" + password; byte[] encoded = Base64.encodeBase64(tobeEncode.getBytes(StandardCharsets.UTF_8)); return "Basic " + new String(encoded); } public static void main(String[] args) { System.out.println(basicAuthHeader("root", "W*!#7Z*N@sLXxs")); } public static void main1(String[] args) throws Exception { DorisStreamLoader dorisStreamLoader = new DorisStreamLoader(); dorisStreamLoader.loadUrl = "http://192.168.21.117:8030/api/sywsdb/%s/_stream_load"; dorisStreamLoader.user = "root"; dorisStreamLoader.password = "WYYTT951"; List<Map<String,Object>> maps = new ArrayList<>(); Map<String,Object> map = new HashMap<>(); map.put("clgj", ""); map.put("jyzid", "4433e13b-1bbb-11ee-ae7e-0242c0a80002"); map.put("jyzdqhdm", "652801"); map.put("jyzsl", 44.00); map.put("lx", "0"); map.put("jyzqqhdm", "652823"); map.put("jyzh", "6550351129"); map.put("dlx", "02"); map.put("dqhdm", "652823"); map.put("ddsl", 44.00); map.put("jyzlx", "1"); map.put("sm", ""); map.put("id", "4e5d72f1-a4fa-480c-85e9-40e19b517d0e"); map.put("jgryxm", "xxxxxx"); map.put("dmc", "xxxxxx"); map.put("sjcrsj", new Date(1691940454000L)); map.put("jgryid", "78e7a042-6908-45f8-999a-422ea4689b47"); map.put("rq",new Date(1691940454000L)); Map<String,Object> map1 = new HashMap<>(); map1.put("clgj", ""); map1.put("jyzid", "44335435-1bbb-11ee-ae7e-0242c0a80002"); map1.put("jyzdqhdm", "653121"); map1.put("jyzsl", 1.00); map1.put("lx", "0"); map1.put("jyzqqhdm", "653121"); map1.put("jyzh", "6550348683"); map1.put("dlx", "02"); map1.put("dqhdm", "653121"); map1.put("ddsl", 1.00); map1.put("jyzlx", "1"); map1.put("sm", ""); map1.put("id", "c2bce8d2-43f7-4c3c-9166-e7bba7ac1d2b"); map1.put("jgryxm", "xxxxxx"); map1.put("dmc", "xxxxxx"); map1.put("sjcrsj", new Date(1691940453000L)); map1.put("jgryid", "6059858a-483b-4e2b-a98f-27f423c3d886"); map1.put("rq",new Date(1688212304000L)); Map<String,Object> map2 = new HashMap<>(); map2.put("clgj", ""); map2.put("jyzid", "44340156-1bbb-11ee-ae7e-0242c0a80002"); map2.put("jyzdqhdm", "652926"); map2.put("jyzsl", 10000.00); map2.put("lx", "0"); map2.put("jyzqqhdm", "652926"); map2.put("jyzh", "6550351562"); map2.put("dlx", "02"); map2.put("dqhdm", "652926"); map2.put("ddsl", 10000.00); map2.put("jyzlx", "1"); map2.put("sm", ""); map2.put("id", "6cd3f741-b8c8-4343-a510-78a6be3b7adc"); map2.put("jgryxm", "xxxxxx"); map2.put("dmc", "xxxxxx"); map2.put("sjcrsj", new Date(1691940454000L)); map2.put("jgryid", "a56ffc0b-09d0-4e34-82e2-8457ccb0625b"); map2.put("rq",new Date(1688439693000L)); maps.add(map); maps.add(map1); maps.add(map2); dorisStreamLoader.loadJson("jyz_dd",maps,null); } }

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

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

相关文章

如何用AI优化测试用例生成?实战案例

AI在测试用例生成中的革命性作用 在软件测试领域&#xff0c;测试用例生成是保障产品质量的核心环节&#xff0c;但传统方法依赖人工编写&#xff0c;存在效率低下、覆盖不全和易遗漏边界条件等问题。截至2026年&#xff0c;AI技术&#xff08;如机器学习、自然语言处理和深度…

测试AI驱动的聊天机器人:NLU评估指南

NLU在AI聊天机器人中的核心地位 AI驱动的聊天机器人已成为企业客服、虚拟助手等领域的标配&#xff0c;其核心能力依赖于自然语言理解&#xff08;NLU&#xff09;模块。NLU负责解析用户输入的语义&#xff0c;识别意图、抽取实体并维护对话上下文。对于软件测试从业者而言&am…

探索高效的搜索研究文献的方式与技巧研究

刚开始做科研的时候&#xff0c;我一直以为&#xff1a; 文献检索就是在知网、Google Scholar 里反复换关键词。 直到后来才意识到&#xff0c;真正消耗精力的不是“搜不到”&#xff0c;而是—— 你根本不知道最近这个领域发生了什么。 生成式 AI 出现之后&#xff0c;学术检…

Redis事务:面试必看!解读其本质与实际应用场景

文章目录如何理解 Redis 事务&#xff1f;什么是事务&#xff1f;Redis 事务的实现机制代码示例错误处理为什么需要事务&#xff1f;1. 保证操作的原子性2. 避免竞争条件3. 提高性能如何正确使用 Redis 事务&#xff1f;情景模拟&#xff1a;咖啡馆的订单处理注意事项代码示例&…

强烈安利专科生必看!8款AI论文网站TOP8测评

强烈安利专科生必看&#xff01;8款AI论文网站TOP8测评 专科生写作利器测评&#xff1a;2026年AI论文网站TOP8深度解析 随着人工智能技术的不断进步&#xff0c;AI论文网站已经成为众多专科生撰写学术论文的重要工具。然而&#xff0c;面对市场上琳琅满目的选择&#xff0c;如何…

如何查阅最新的研究论文

刚开始做科研的时候&#xff0c;我一直以为&#xff1a; 文献检索就是在知网、Google Scholar 里反复换关键词。 直到后来才意识到&#xff0c;真正消耗精力的不是“搜不到”&#xff0c;而是—— 你根本不知道最近这个领域发生了什么。 生成式 AI 出现之后&#xff0c;学术检…

【收藏必备】LangChainLangGraph:AI Agent智能体开发全攻略,助你掌握大模型时代核心技能

本文详细介绍了LangChain和LangGraph这两个AI Agent开发框架&#xff0c;强调LangChain是目前最受欢迎的AI Agent开发框架&#xff0c;拥有90%的市场需求。文章解析了LangChain的基本概念、核心功能和三层架构&#xff0c;对比了与其他框架的优势&#xff0c;指出其工业级水准和…

工程视角:基于双气体融合的以太网温湿度多参量传感器在高危作业环境中的可靠性设计实践

在规模化养殖、化肥生产、污水处理等工业场景中&#xff0c;氨气&#xff08;NH₃&#xff09;与硫化氢&#xff08;H₂S&#xff09;是两类典型且高频共存的有毒气体。它们不仅具有强刺激性或麻痹性&#xff0c;更因释放源相近&#xff08;如有机物厌氧分解&#xff09;、扩散…

收藏!35岁程序员转型大模型避坑指南:技术迁移+经验复用,轻松实现职业升级

35岁程序员转型大模型应采用"技术迁移经验复用"策略&#xff0c;避免从零学起。根据技术背景分两大方向&#xff1a;有数据/算法基础的转向工程化方向&#xff1b;纯业务开发的转向应用落地方向。文章提供详细学习路径、岗位清单和避坑指南&#xff0c;帮助35程序员快…

面向医疗安全的边缘智能终端:以太网温湿度多参量传感器在环氧乙烷灭菌环境中的双气体监测架构设计

在医疗器械灭菌、生物实验室及医院消毒供应中心&#xff08;CSSD&#xff09;等高风险场景中&#xff0c;环氧乙烷&#xff08;Ethylene Oxide, ETO&#xff09;因其广谱、低温、穿透性强的优势被广泛应用。然而&#xff0c;ETO具有高毒性&#xff08;STEL限值仅1 ppm&#xff…

极速适配星瀚8.0!法大大×金蝶电子签,让每一次签署直达业务

法大大与金蝶基于深度原生集成&#xff0c;率先完成对星瀚8.0的全面适配&#xff0c;不仅化解了平台第三方应用“外挂”式对接带来的高成本、低稳定、运维难等升级困境&#xff0c;更以全生态覆盖、数据实时同步、责任清晰的服务&#xff0c;为企业打通签署数字化“最后一公里”…

学工管理系统用户培训攻略:三大要素让师生轻松上手

✅作者简介&#xff1a;合肥自友科技 &#x1f4cc;核心产品&#xff1a;智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…

【网络安全工程师】从零基础到进阶,看这一篇就够了

学前感言 1.这是一条需要坚持的道路&#xff0c;如果你只有三分钟的热情那么可以放弃往下看了。 2.多练多想&#xff0c;不要离开了教程什么都不会&#xff0c;最好看完教程自己独立完成技术方面的开发。 3.有问题多google,baidu…我们往往都遇不到好心的大神&#xff0c;谁…

TinyPro v1.4.0 正式发布:支持 Spring Boot、移动端适配、新增卡片列表和高级表单页面

本文由体验技术团队Kagol原创。 TinyPro 是一个基于 TinyVue 打造的前后端分离的后台管理系统&#xff0c;支持在线配置菜单、路由、国际化&#xff0c;支持页签模式、多级菜单&#xff0c;支持丰富的模板类型&#xff0c;支持多种构建工具&#xff0c;功能强大、开箱即用&…

导师严选2026 TOP9 AI论文写作软件:自考毕业论文全攻略

导师严选2026 TOP9 AI论文写作软件&#xff1a;自考毕业论文全攻略 2026年AI论文写作工具测评&#xff1a;精准适配自考人群的高效选择 随着人工智能技术的不断进步&#xff0c;AI论文写作工具在学术领域的应用愈发广泛。对于自考学生而言&#xff0c;撰写毕业论文不仅是一项挑…

双模气体监测:一种可扩展的智能感知架构及其在多场景中的工程实践

在工业安全、智慧环保、医疗健康和新能源等高风险或高价值场景中&#xff0c;单一气体传感器往往难以准确刻画真实环境风险。无论是养殖场的氨气泄漏、医院灭菌室的环氧乙烷残留&#xff0c;还是锂电池热失控释放的氢气&#xff0c;危险事件的本质通常是多参数耦合的结果。正因…

论文搜索途径探索:高效获取学术资源的方法与策略研究

刚开始做科研的时候&#xff0c;我一直以为&#xff1a; 文献检索就是在知网、Google Scholar 里反复换关键词。 直到后来才意识到&#xff0c;真正消耗精力的不是“搜不到”&#xff0c;而是—— 你根本不知道最近这个领域发生了什么。 生成式 AI 出现之后&#xff0c;学术检…

深度测评!本科生毕业论文必备的8个AI论文网站

深度测评&#xff01;本科生毕业论文必备的8个AI论文网站 2026年学术写作工具测评&#xff1a;为何需要一份精准的AI论文网站榜单 随着人工智能技术在学术领域的广泛应用&#xff0c;越来越多的本科生开始依赖AI工具辅助论文写作。然而&#xff0c;面对市场上种类繁多的平台&am…

java连接mysql数据库实现图书馆管理系统,零基础入门到精通,收藏这篇就够了

图书馆管理系统&#xff0c;具体功能包括&#xff1a; 1. 用户登录 2. 用户注册 3. 新图书入库 4. 图书信息查询 5. 图书更新&#xff08;修改&#xff09; 6. 旧图书删除 7. 办理借阅证登记 8. 图书借阅管理 完整项目&#xff1a;https://download.csdn.net/download/sger123/…

Java中VO、DTO、BO、DO、PO傻傻分不清?一篇文章让你彻底搞懂!_java vo,零基础入门到精通,收藏这篇就够了

深入浅出讲解各层对象区别实战应用代码对比&#xff0c;告别概念混淆&#xff0c;设计出更优雅的系统架构&#xff01; “新手最大的噩梦&#xff1a;一个Java项目里&#xff0c;满眼都是XxxVO、XxxDTO、XxxBO、XxxDO、XxxPO…” &#x1f635; 是不是经常被这些相似的概念搞…