C# .Net Core通过StreamLoad向Doris写入CSV数据

news2024/11/26 8:29:43

以下代码可以只关注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列顺序和数量保持一致(4)注意认证信息格式为username:password,数据库用户

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.ApiHost
	client.BaseAddress = new Uri(settings.ApiHost);
	client.Timeout = TimeSpan.FromSeconds(300);
}).ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
{
	AllowAutoRedirect = false
});

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

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

相关文章

Linux操作系统学习---初识环境变量

目录 ​编辑 环境变量的概念&#xff1a; 小插曲&#xff1a;main函数的第一、二个参数 获取环境变量信息&#xff1a; 1.main函数的第三个参数 2.查看单个环境变量 3.c语言库函数getenv() 和环境变量相关的操作指令&#xff1a; 1.export---导出环境变量&#xff1a; 2.unse…

跨平台应用开发框架(1)----Qt(组件篇)

目录 1.Qt 1.Qt 的主要特点 2.Qt的使用场景 3.Qt的版本 2.QtSDK 1.Qt SDK 的组成部分 2.安装 Qt SDK 3.Qt SDK 的优势 3.Qt初识 1.快速上手 widget.cpp mian.cpp widget.h Helloworld.pro 2.对象树 3.坐标系 4.信号和槽 1. 信号和槽的基本概念 2. 信号和槽的…

mysql索引失效的五种情况

第一种 违反最左前缀法则 这个是针对联合索引的。 假设有个tb_seller表&#xff0c;现在给三个字段建立联合索引&#xff0c;建立的时候字段顺序不可随便设置&#xff0c;字段顺序&#xff1a; name, status, address。下图Seq_in_index对应的是联合索引顺序。 判断索引失效用…

H3C OSPF 多区域实验

目录 前言 实验拓扑 实验需求 实验解析 路由器配置 测试 前言 此篇文章为 OSPF多区域试验&#xff0c;建议先食用OSPF单区域实验&#xff0c;理解实验原理 学习基本配置&#xff0c;再来使用此篇&#xff0c;效果更佳&#xff01;&#xff08;当然如果你已经了解原理与基…

算法 Java实现

一.查找算法 1.分块查找 二.排序算法 1.冒泡排序

优先算法 —— 双指针系列 - 快乐数

1. 快乐数 题目链接&#xff1a; 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/happy-number/description/ 2. 题目解析 示例1&#xff1a; 示例2&#xff1a; 3. 算法原理 两种情况&#xff1a;我们可以把两种情况都看作为循环&#xff0…

【机器学习】——卷积与循环的交响曲:神经网络模型在现代科技中的协奏

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

php 导出excel 一个单元格 多张图片

public function dumpData(){error_reporting(0); // 禁止错误信息输出ini_set(display_errors, 0); // 不显示错误$limit $this->request->post(limit, 20, intval);$offset $this->request->post(offset, 0, intval);$page floor($offset / $limit) 1 ;$wh…

几天游记啊

绿灯常亮&#xff0c;黄灯闪&#xff0c;就是没有上线状态 一 2024.11.24 青浦圆通信息中心&#xff1a;vsphere client IDC运维专员可能就这项技能稀缺 二 2024.11.25 1 字节服务器外包单位有孚网路 什么互联网交换中心 不了解的人还以为是国家火炬计划呢&#xff01;实际…

【C++动态规划 子集状态压缩】2002. 两个回文子序列长度的最大乘积|1869

本文涉及知识点 C动态规划 位运算、状态压缩、枚举子集汇总 LeetCode2002. 两个回文子序列长度的最大乘积 给你一个字符串 s &#xff0c;请你找到 s 中两个 不相交回文子序列 &#xff0c;使得它们长度的 乘积最大 。两个子序列在原字符串中如果没有任何相同下标的字符&…

记录:从.Net程序的内存转储文件中提取内存数据过程

1.准备材料&#xff1a;xxx.dump转储文件&#xff0c;VS2022 2.提取过程 使用VS打开xxx.dump文件VS中点击 调试托管内存 按钮查找需要导出的变量&#xff0c;注&#xff1a;通过类型查找时基础变量类型跟原类型不一样&#xff0c;如string对应String&#xff0c;bool对应Bool…

Nacos学习文档

目录 1、Nacos是什么2、Nacos名词介绍3、Nacos中的data id是如何组装的&#xff1f;4、Nacos 融合 Spring Cloud&#xff0c;成为注册配置中心4.1、Maven依赖作用4.2、启动配置管理4.2.1、添加依赖4.2.2、在 bootstrap.yml&#xff08;也支持properties格式&#xff09; 中添加…

QT简易项目 数据库可视化界面 数据库编程SQLITE QT5.12.3环境 C++实现

案例需求&#xff1a; 完成数据库插入&#xff0c;删除&#xff0c;修改&#xff0c;查看操作。 分为 插入&#xff0c;删除&#xff0c;修改&#xff0c;查看&#xff0c;查询 几个模块。 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget…

【Linux学习】【Ubuntu入门】2-3 make工具和makefile引入

1.使用命令新建三个.c文件vi main.c&#xff0c;vi input.c&#xff0c;vi caclcu.c&#xff0c;两个.h文件vi input.h&#xff0c;vi caclcu.h 2.vi Makefile&#xff1a;新建Makefile文件&#xff0c;输入一下内容 注意&#xff1a;命令列表中每条命令前用TAB键&#xff0c;不…

Gazebo仿真实现无人机+Apriltag码动态跟踪

目录 演示 一、环境 二、配置 创建模型 首先相机创建 添加相机 Apriltag创建 地图添加apriltag码 Apriltag_ros配置 三、代码运行 四、问题 修改相机模型的参数 演示 一、环境 ROSgazebo配置 Px4Mavros Apriltag_ros编译 二、配置 在默认的mavros_posix_sitl.l…

H.265流媒体播放器EasyPlayer.js播放器提示MSE不支持H.265解码可能的原因

随着人工智能和机器学习技术的应用&#xff0c;流媒体播放器将变得更加智能&#xff0c;能够根据用户行为和偏好提供个性化的内容推荐。总体而言&#xff0c;流媒体播放器的未来发展将更加注重技术创新和用户互动&#xff0c;以适应不断变化的市场需求和技术进步。 提示MSE不支…

加菲工具 - 好用免费的在线工具集合

加菲工具 https://orcc.online AI 工具 集合了目前主流的&#xff0c;免费可用的ai工具 文档处理 pdf转word、office与pdf互转等等工具都有链接 图片图标 统计了好用免费的在线工具 编码解码 base64编码解码、url编码解码、md5计算、进制转换等等 其它 还有其他好用的…

【linux学习指南】初识Linux进程信号与使用

文章目录 &#x1f4dd;信号快速认识&#x1f4f6;⽣活⻆度的信号&#x1f4f6; 技术应⽤⻆度的信号&#x1f309; 前台进程&#xff08;键盘&#xff09;&#x1f309;⼀个系统函数 &#x1f4f6;信号概念&#x1f4f6;查看信号 &#x1f320; 信号处理&#x1f309; 忽略此信…

今天你学C++了吗?——C++中的类与对象(第二集)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

Anaconda3 2024 jupyter notebook 配置默认文件路径

我的版本如下&#xff1a; 第一步&#xff1a; 打开命令行anaconda prompt &#xff0c; 敲下面命令生成配置文件 jupyter notebook --generate-config 如下图&#xff1a; 修改配置jupyter_notebook_config.py 文件中搜索c.ServerApp.root_dir &#xff08; 对于 Anac…