怎么使用 Go 语言操作 Apache Doris

news2024/11/25 5:21:37

Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。基于此,Apache Doris 能够较好的满足报表分析、即席查询、统一数仓构建、数据湖联邦查询加速等使用场景,用户可以在此之上构建用户行为分析、AB 实验平台、日志检索分析、用户画像分析、订单分析等应用。

使用 Doris 的用户都知道 Doris 是完全兼容 MySQL 协议的,我们可以使用任意 MySQL 客户端或者 Connector 去连接 Doris,用 SQL 操作 Doris,这样你可以使用任意语言来操作 Doris。今天我们演示使用 Go 语言来访问 Doris ,完成查询和 插入操作。

Go 与 MySQL 的结合还是比较容易的,像是连接,增、删、改这些操作都比较简单。

Go 语言的安装配置还是很简单的,这里我们就不做介绍了,直接开始

安装驱动

安装 Go 连接 MySQL的驱动

go get github.com/go-sql-driver/mysql

在我们程序里导入依赖库

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
)

连接Doris数据库

var (
  // 定义一个全局对象db
  db *sql.DB
  //连接Doris的用户名
  userName string = "root"
  //连接Doris的密码
  password string = ""
  //连接Doris的地址
  ipAddress string = "127.0.0.1"
  //连接Doris的端口号,默认是9030
  port int = 9030
  //连接Doris的具体数据库名称
  dbName string = "test"
)
​
func initDB() (err error) {
  dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", userName, password, ipAddress, port, dbName)
  //Open打开一个driverName指定的数据库,dataSourceName指定数据源
  //不会校验用户名和密码是否正确,只会对dsn的格式进行检测
  db, err = sql.Open("mysql", dsn)
  //dsn格式不正确的时候会报错
  if err != nil { 
    return err
  }
  //尝试与数据库连接,校验dsn是否正确
  err = db.Ping()
  if err != nil {
    fmt.Println("校验失败,err", err)
    return err
  }
  // 设置最大连接数
  db.SetMaxOpenConns(50)
  // 设置最大的空闲连接数
  // db.SetMaxIdleConns(20)
  fmt.Println("连接数据库成功!")
  return nil
}

验证连接

func main() {
  err := initDB()
  if err != nil {
    fmt.Println("初始化数据库失败,err", err)
    return
  }
}

查询数据表

这里我们简单做一个查询表里的所有数据

我的表结构如下:

CREATE TABLE `t_cn_search` (
  `md5` varchar(100) NULL,
  `book_line` text NULL,
  INDEX idx_line (`book_line`) USING INVERTED PROPERTIES("parser" = "chinese", "support_phrase" = "true") COMMENT ''
) ENGINE=OLAP
DUPLICATE KEY(`md5`)
COMMENT 'OLAP'
DISTRIBUTED BY HASH(`md5`) BUCKETS 2
PROPERTIES (
"replication_allocation" = "tag.location.default: 1",
"is_being_synced" = "false",
"storage_format" = "V2",
"light_schema_change" = "true",
"disable_auto_compaction" = "false",
"enable_single_replica_compaction" = "false"
);

我这个表是一个日志检索用的表,使用了 Doris 的倒排索引,我们匹配任意关键字粒子

查询程序:

// 查询数据
func QueryRow() {
  rows, _ := db.Query("select * from t_cn_search where book_line MATCH_ANY '粒子'") //获取所有数据
  var md5 int
  var book_line string
  for rows.Next() { //循环显示所有的数据
    rows.Scan(&md5, &book_line)
    fmt.Println(md5, "--", book_line)
  }
}

我们执行程序可以看到查询结果:

插入数据

我们现在来演示怎么插入数据,这个演示的是我们通过 Doris 提供的 TVF(Table Value Function)将 HDFS 上文件数据直接导入到 Doris 的表里。

我的 hdfs 上的文件格式是 Parquet,我们可以通过 TVF 来看一下这个表的数据结构

mysql> desc function hdfs(
    ->             "uri" = "hdfs://localhost:9000/tmp/test.parquet",
    ->             "fs.defaultFS" = "hdfs://localhost:9000",
    ->             "hadoop.username" = "doris",
    ->             "format" = "parquet");
+----------------+------+------+-------+---------+-------+
| Field          | Type | Null | Key   | Default | Extra |
+----------------+------+------+-------+---------+-------+
| date           | TEXT | Yes  | false | NULL    | NONE  |
| user_src       | TEXT | Yes  | false | NULL    | NONE  |
| order_src      | TEXT | Yes  | false | NULL    | NONE  |
| order_location | TEXT | Yes  | false | NULL    | NONE  |
| new_order      | INT  | Yes  | false | NULL    | NONE  |
| payed_order    | INT  | Yes  | false | NULL    | NONE  |
| pending_order  | INT  | Yes  | false | NULL    | NONE  |
| cancel_order   | INT  | Yes  | false | NULL    | NONE  |
| reject_order   | INT  | Yes  | false | NULL    | NONE  |
| good_order     | INT  | Yes  | false | NULL    | NONE  |
| report_order   | INT  | Yes  | false | NULL    | NONE  |
+----------------+------+------+-------+---------+-------+
11 rows in set (0.16 sec)
​

Doris 的表结构如下:

 CREATE TABLE `order_analysis` (
  `date` varchar(57) NULL,
  `user_src` varchar(27) NULL,
  `order_src` varchar(33) NULL,
  `order_location` varchar(6) NULL,
  `new_order` int(11) NULL,
  `payed_order` int(11) NULL,
  `pending_order` int(11) NULL,
  `cancel_order` int(11) NULL,
  `reject_order` int(11) NULL,
  `good_order` int(11) NULL,
  `report_order` int(11) NULL
) ENGINE=OLAP
DUPLICATE KEY(`date`)
COMMENT 'OLAP'
DISTRIBUTED BY HASH(`date`) BUCKETS 2
PROPERTIES (
"replication_allocation" = "tag.location.default: 1",
"is_being_synced" = "false",
"storage_format" = "V2",
"light_schema_change" = "true",
"disable_auto_compaction" = "false",
"enable_single_replica_compaction" = "false"
);

将 hdfs 文件数据导入到 Doris 表里,这里我们使用的是 insert into tbl select 这个操作

func insert() {
  result, err := db.Exec("insert into order_analysis select * from hdfs(" +
    "\"uri\" = \"hdfs://localhost:9000/tmp/test.parquet\"," +
    "\"fs.defaultFS\" = \"hdfs://localhost:9000\"," +
    "\"hadoop.username\" = \"doris\"," +
    "\"format\" = \"parquet\")")
  if err != nil {
    fmt.Println("预处理失败:", err)
    return
  }
​
  if err != nil {
    fmt.Println("执行预处理失败:", err)
    return
  } else {
    rows, _ := result.RowsAffected()
    fmt.Println("执行成功,影响行数", rows, "行")
  }
}

执行完成之后我们可以看到返回的结果

连接数据库成功!
执行成功,影响行数 5061 行

总结

是不是很简单,你可以使用任意语言通过 MySQL 协议来操作 Doris ,后面我们会在讲解通过 Go 语言使用 Doris 提供的 Stream load(http协议)来完成数据导入的操作。

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

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

相关文章

为什么 Lettuce 会带来更长的故障时间?

作者:杨博东(凡澈) 本文详述了阿里云数据库 Tair/Redis 将使用长连接客户端在非预期故障宕机切换场景下的恢复时间从最初的 900s 降到 120s 再到 30s的优化过程,涉及产品优化,开源产品问题修复等诸多方面。 一、背景 …

【数据结构】排序算法(一)—>插入排序、希尔排序、选择排序、堆排序

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.直接插入排序 2.希尔排序 3.直接选择排…

力扣:112. 路径总和(Python3)

题目: 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。 叶子节点…

用css画一个半圆弧(以小程序为例)

一、html结构 圆弧的html结构是 两个块级元素嵌套。 <View classNamewrap><View className"inner">{/* 图标下的内容 */}</View></View>二、css样式&#xff1a;原理是两个半圆叠在一起&#xff0c;就是一个半圆弧。那么&#xff0c;如何画一…

【小白专属03】SpringBoot实现增删改查

目录 前言 一、新建Controller层 二、使用PostMan测试接口 前言 上节回顾 上一节我们SpringBoot集成了MybatisPlus。MybatisPlus是一个Mybatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 本节介绍 这一节&#x…

基于微信小程序的明星应援小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

DirectX12_Windows_GameDevelop_0:启程之旅

前言 今天是2023年9月28日&#xff0c;明天就是中秋节了&#xff0c;先祝福大家中秋快乐&#xff01;时光飞逝&#xff0c;岁月如梭&#xff0c;大学四年一晃而逝&#xff0c;眨眼间我们即将毕业。毕业不是意味着要面对社会的险恶&#xff0c;也不是意味着要当打工社畜&#x…

cesium在vue中引入报错解决;cesium在vue中初始化地球

第一步&#xff1a; npm install cesium 第二步&#xff1a; 找到node_modules/cesium/Build/Cesium 文件夹&#xff0c;把这个 Cesium 文件夹复制一份到项目的 public 文件夹下 第三步&#xff1a; 在public文件夹下的index.html 文件中&#xff0c;head 标签里面&#…

51单片机实训项目之产品数量计数器

/********************************************************************************* * 【实验平台】&#xff1a; QX-MCS51 单片机开发板 * 【外部晶振】&#xff1a; 11.0592mhz * 【主控芯片】&#xff1a; STC89C52 * 【编译环境】&#xff1a; Keil μVisio3 * 【程序…

BiMPM实战文本匹配【上】

引言 今天来实现BiMPM模型进行文本匹配&#xff0c;数据集采用的是中文文本匹配数据集。内容较长&#xff0c;分为上下两部分。 数据准备 数据准备这里和之前的模型有些区别&#xff0c;主要是因为它同时有字符词表和单词词表。 from collections import defaultdict from …

3 OpenCV两张图片实现稀疏点云的生成

前文&#xff1a; 1 基于SIFT图像特征识别的匹配方法比较与实现 2 OpenCV实现的F矩阵RANSAC原理与实践 1 E矩阵 1.1 由F到E E K T ∗ F ∗ K E K^T * F * K EKT∗F∗K E 矩阵可以直接通过之前算好的 F 矩阵与相机内参 K 矩阵获得 Mat E K.t() * F * K;相机内参获得的方式…

spring6-IOC容器

IOC容器 1、IoC容器1.1、控制反转&#xff08;IoC&#xff09;1.2、依赖注入1.3、IoC容器在Spring的实现 2、基于XML管理Bean2.1、搭建子模块spring6-ioc-xml2.2、实验一&#xff1a;获取bean①方式一&#xff1a;根据id获取②方式二&#xff1a;根据类型获取③方式三&#xff…

Zilliz@阿里云:大模型时代下Milvus Cloud向量数据库处理非结构化数据的最佳实践

大模型时代下的数据存储与分析该如何处理?有没有已经落地的应用实践? 为探讨这些问题,近日,阿里云联合 Zilliz 和 Doris 举办了一场以《大模型时代下的数据存储与分析》为主题的技术沙龙,其中,阿里云对象存储 OSS 上拥有海量的非结构化数据,Milvus(Zilliz)作为全球最有…

华为摄像头智能安防监控解决方案

云时代来袭&#xff0c;数字化正在从园区办公延伸到生产和运营的方方面面&#xff0c;智慧校园&#xff0c;柔性制造&#xff0c;掌上金融和电子政务等&#xff0c;面对各种各样的新兴业态的涌现&#xff0c;企业需要构建一张无所不联、随心体验、业务永续的全无线网络&#xf…

多线程锁-线程锁知识概述、乐观锁和悲观锁

3. 说说Java"锁"事 3.1 从轻松的乐观锁和悲观锁开讲 悲观锁&#xff1a; 认为自己在使用数据的时候一定有别的线程来修改数据&#xff0c;因此在获取数据的时候会先加 锁&#xff0c;确保数据不会被别的线程修改&#xff0c;synchronized和Lock的实现类都是悲观锁…

【通意千问】大模型GitHub开源工程学习笔记(2)

使用Transformers来使用模型 如希望使用Qwen-chat进行推理,所需要写的只是如下所示的数行代码。请确保你使用的是最新代码,并指定正确的模型名称和路径,如Qwen/Qwen-7B-Chat和Qwen/Qwen-14B-Chat 这里给出了一段代码 from transformers import AutoModelForCausalLM, Aut…

正点原子lwIP学习笔记——WebServer实验

1. WebServer简介 Web Server就是提供Web服务的Server&#xff0c;主要功能是&#xff1a;存储、处理和传递网页给客户端&#xff0c;他只需支持HTTP协议、HTML文档格式以及URL&#xff0c;与客户端的网络浏览器配套。 其中&#xff0c;HTTP的协议就是基于TCP进一步实现的&…

零代码编程:用ChatGPT批量修改文件夹名称中的大小写

一个文件夹下面有很多个子文件夹&#xff0c;要把文件夹中的大写数字全部重命名为小写数字&#xff0c;比如将二 三 四&#xff0c;改成&#xff1a; 2 34 在ChatGPT中输入提示词如下&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个文件夹重命名的任务。具体步骤如…

芯片测试方案之如何测试芯片EN输入阈值?

在电源管理芯片的设计中&#xff0c;除了常规的VIN、VOUT以及GND端口之外&#xff0c;还会有SW、EN、FB等芯片独有的特殊端口引脚&#xff0c;这些引脚或负责电源开关的输入&#xff0c;或负责电路的反馈电压/电流&#xff0c;这些引脚在芯片的工作中有着极其重要的作用&#x…

CUDA学习笔记0929

一、GPU缓存和变量作用域 1. 缓存类型 &#xff08;1&#xff09;GPU缓存是非可编程存储区域 &#xff08;2&#xff09;GPU包含4类缓存&#xff1a; L1缓存&#xff0c;每个流处理器一个 L2缓存&#xff0c;全部流处理器共享一个 L1和L2都可用于存储本地和全局内存中的数…