C# .Net Core通过StreamLoad向Doris写入CSV数据
以下代码可以只关注StreamLoad具体实现。
1.创建StreamLoad返回值Model
public class StreamLoadResponse
{public long TxnId { get; set; }public string Label { get; set; }public string Comment { get; set; }public string TwoPhaseCommit { get; set; }public string Status { get; set; }public string Message { get; set; }public long NumberTotalRows { get; set; }public long NumberLoadedRows { get; set; }public long NumberFilteredRows { get; set; }public long NumberUnselectedRows { get; set; }public long LoadBytes { get; set; }public long LoadTimeMs { get; set; }public long BeginTxnTimeMs { get; set; }public long StreamLoadPutTimeMs { get; set; }public long ReadDataTimeMs { get; set; }public long WriteDataTimeMs { get; set; }public long CommitAndPublishTimeMs { get; set; }
}
2.创建Doris StreamLoad接口
public interface IDorisApiService
{/// <summary>/// /// </summary>/// <param name="database">数据库</param>/// <param name="table">表</param>/// <param name="authorization">认证信息,格式 username:pwd</param>/// <param name="content">csv格式的字符串</param>/// <returns></returns>StreamLoadResponse StreamLoad(string database, string table, string authorization, string content);
}
3.实现接口,核心代码,逻辑并不复杂,组装一个http请求所需的内容。
需要注意的是:(1)示例csv格式的字符串分割符为‘\t’,而不是常用的逗号,这也是官方默认的分割方式,如果你想用其他的分隔符,需要在header里配置column_separator。建议不要用逗号,因为涉及到复杂的json字符串的时候,里面的逗号会导致解析异常,即便官方文档里有相关的处理方式(enclose),似乎仍然存在问题。(2)我们请求了两次,第一次请求会重定向到BE节点的地址,然后用此地址再次请求。这是正常的。(3)我们采用的format是csv_with_names,第一行是列明,请确保跟数据库table列顺序和数量保持一致
public class DorisApiService : IDorisApiService
{private readonly HttpClient _httpClient;public DorisApiService(HttpClient httpClient){_httpClient = httpClient;}public StreamLoadResponse StreamLoad(string database, string table, string authorization, string content){var url = $"/api/{database}/{table}/_stream_load";var request = new HttpRequestMessage(HttpMethod.Put, url);request.Headers.Add("Expect", "100-continue");request.Headers.Add("format", "csv_with_names");request.Headers.Add("column_separator", "\t");request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", authorization);var response = _httpClient.Send(request, HttpCompletionOption.ResponseHeadersRead);if (response.StatusCode == HttpStatusCode.TemporaryRedirect || response.StatusCode == HttpStatusCode.RedirectKeepVerb){var redirectUrl = response.Headers.Location.ToString();request = new HttpRequestMessage(HttpMethod.Put, redirectUrl){Content = new StringContent(content, Encoding.UTF8, "text/plain")};request.Headers.Add("Expect", "100-continue");request.Headers.Add("format", "csv_with_names");request.Headers.Add("column_separator", "\t");request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", authorization);response = _httpClient.Send(request, HttpCompletionOption.ResponseHeadersRead);}string responseBody = response.Content.ReadAsStringAsync().Result; if (response.IsSuccessStatusCode){var streamLoadResponse = JsonSerializer.Deserialize<StreamLoadResponse>(responseBody);if (streamLoadResponse.Status == "Success"){return streamLoadResponse;}else{throw new Exception(responseBody);}}else{throw new Exception(responseBody);}}
}
4.Program配置
services.AddHttpClient<IDorisApiService, DorisApiService>(client =>
{//从配置文件获取Doris的请求地址和端口:settings.ApiHostclient.BaseAddress = new Uri(settings.ApiHost);client.Timeout = TimeSpan.FromSeconds(300);
}).ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
{AllowAutoRedirect = false
});
相关文章:
C# .Net Core通过StreamLoad向Doris写入CSV数据
以下代码可以只关注StreamLoad具体实现。 1.创建StreamLoad返回值Model public class StreamLoadResponse {public long TxnId { get; set; }public string Label { get; set; }public string Comment { get; set; }public string TwoPhaseCommit { get; set; }public string…...
React-自定义Hook与逻辑共享
#题引:我认为跟着官方文档学习不会走歪路 在 React 中,自定义 Hook 是一种复用逻辑的方式。自定义 Hook 是一个 JavaScript 函数,名称以 use 开头,可以调用其他的 Hook, 可以返回任意值。 创建自定义Hook 假设你正在开发一款重…...

蓝桥杯每日真题 - 第17天
题目:(最大数字) 题目描述(13届 C&C B组D题) 题目分析: 操作规则: 1号操作:将数字加1(如果该数字为9,变为0)。 2号操作:将数字…...
游戏开发实现简易实用的ui框架
游戏开发实现简易实用的ui框架 本文使用cocos引擎实现,框架代码本质上不依赖某一个引擎,稍作修改也能作为其他引擎的实现 1.1 UI管理框架的核心需求剖析 分层与类型管理 对不同类型UI需要进行分层管理。不同层级的UI需要有不同的父节点,保证渲…...
vue3的attr透传属性详解和使用法方式。以及在css样式的伪元素中实现
在 Vue 3 和 TypeScript 中,属性透传(attr pass-through)是指将组件的属性传递到其根元素或某个子元素中。这个概念在开发可复用的组件时非常有用,尤其是当你希望将父组件的属性动态地传递给子组件的某个 DOM 元素时。 在 Vue 3 …...
【仿真建模-MESA】框架简介
1. 简介 Mesa是一个基于Python3的开源项目,旨在提供一个现代、易用的多智能体仿真环境。它借鉴了NetLogo、Repast和MASON等多智能体仿真框架的优点,并结合Python语言的强大功能,为用户提供了丰富的建模和仿真工具。 《官方文档》 2. 核心组件…...

Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)
目录 Linux软件包管理器 - yum Linux下安装软件包的方式 认识yum 查找软件包 安装软件 如何实现本地机器和云服务器之间的文件互传 卸载软件 Linux编辑器 - vim vim的基本概念 vim下各模式的切换 批量化注释 vim的简单配置 Linux编译器 - gcc/g gcc/g的作用 gcc/g语…...

VSCode 间距太小
setting->font family 使用:Consolas, Courier New, monospace 字体...

【K8S系列】imagePullSecrets配置正确,但docker pull仍然失败,进一步排查详细步骤
如果 imagePullSecrets 配置正确,但在执行 docker pull 命令时仍然失败,可能存在以下几种原因。以下是详细的排查步骤和解决方案。 1. 检查 Docker 登录凭证 确保你使用的是与 imagePullSecrets 中相同的凭证进行 Docker 登录: 1.1 直接登录 在命令行中,执行以下命令: …...

【ARM Coresight OpenOCD 系列 5.1 -- OpenOCD 无法识别CPUID 问题: xxx is unrecognized】
请阅读【嵌入式开发学习必备专栏】 文章目录 OpenOCD 无法识别CPUID 问题ARM CPUIDCPUID 特性CPUID 寄存器字段OpenOCD 无法识别CPUID 问题 在使用OpenOCD 进行CPU debug的过程中有时会报出 无法识别CPUID的问题,本文将会介绍如何解决这个问题。首先我们来学习下什么是CPUID,…...

如何实现点击目录跳转到指定位置?【vue】
需求:实现目录点击跳转到指定位置,点击后直接定位到指定模块 效果: 实现方法: (1)a标签跳转 普通使用: <!DOCTYPE html> <html><head><title>a-Demo</title>&l…...
SQL 通配符
SQL 通配符 在SQL中,通配符是一种特殊字符,用于在LIKE子句中搜索数据。它们主要用于模式匹配,允许你搜索符合特定模式的值。SQL中的通配符通常用于SELECT、UPDATE和DELETE语句中,以增加查询的灵活性。本文将详细介绍SQL中常用的通…...

ubuntu显示管理器_显示导航栏
ubuntu文件管理器_显示导航栏 一、原始状态: 二、显示导航栏状态: 三、原始状态--->导航栏状态: 1、打开dconf编辑器,直接在搜索栏搜索 dconf-editor ------如果没有安装,直接按流程安装即可。 2、进入目录:org …...
黑芝麻嵌入式面试题及参考答案
请详细描述二叉树的深度优先搜索(dfs)流程。 深度优先搜索是一种用于遍历二叉树的重要算法,主要有先序遍历、中序遍历和后序遍历三种方式。 先序遍历的流程是,首先访问根节点,然后递归地遍历左子树,最后递归地遍历右子树。这就好比是在探索一个家族树,先拜访家族中的长辈…...

使用 PyTorch-BigGraph 构建和部署大规模图嵌入的完整教程
当涉及到图数据时,复杂性是不可避免的。无论是社交网络中的庞大互联关系、像 Freebase 这样的知识图谱,还是推荐引擎中海量的数据量,处理如此规模的图数据都充满挑战。 尤其是当目标是生成能够准确捕捉这些关系本质的嵌入表示时,…...
系统性能优化方法论详解:从理解系统到验证迭代
在当今的企业级和云计算环境中,系统性能优化已成为提升竞争力的关键因素。本文将对系统优化的步骤进行深入解析,帮助读者系统化地进行性能优化,从而显著提升系统的整体表现。 流程概述: 系统性能优化的流程可以分为以下几个关键步骤&#x…...

使用Tengine 对负载均衡进行状态检查(day028)
本篇文章对于在服务器已经安装了nginx,但却希望使用Tengine 的状态检查或其他功能时使用,不需要卸载服务器上的nginx,思路是使用干净服务器(未安装过nginx)通过编译安装Tengine,通过对./configure的配置,保证安装Tengi…...

网站推广实战案例:杭州翔胜科技有限公司如何为中小企业打开市场大门
以下是以杭州翔胜科技有限公司为例,解析其如何通过网站推广为中小企业打开市场大门的实战案例: 一、一站式网站推广方案 杭州翔胜科技有限公司提供一站式网站推广方案,该方案整合了多种推广手段,如搜索引擎优化(SEO&a…...

视频修复技术和实时在线处理
什么是视频修复? 视频修复技术的目标是填补视频中的缺失部分,使视频内容连贯合理。这项技术在对象移除、视频修复和视频补全等领域有着广泛的应用。传统方法通常需要处理整个视频,导致处理速度慢,难以满足实时处理的需求。 技术发…...

文心一言 VS 讯飞星火 VS chatgpt (396)-- 算法导论25.2 1题
一、在图 25-2 所示的带权重的有向图上运行 Floyd-Warshall 算法,给出外层循环的每一次迭代所生成的矩阵 D ( k ) D^{(k)} D(k) 。如果要写代码,请用go语言。 文心一言: 好的,让我们一步步分析在带权重的有向图上运行 Floyd-Wa…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...