怎么使用 Go 语言操作 Apache Doris

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据仓库AnalyticDB MySQL版,基础版 8ACU 100GB 1个月
简介: 怎么使用 Go 语言操作 Apache Doris

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)
  }
}

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

5.png

插入数据


我们现在来演示怎么插入数据,这个演示的是我们通过 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协议)来完成数据导入的操作。

相关实践学习
AnalyticDB MySQL海量数据秒级分析体验
快速上手AnalyticDB MySQL,玩转SQL开发等功能!本教程介绍如何在AnalyticDB MySQL中,一键加载内置数据集,并基于自动生成的查询脚本,运行复杂查询语句,秒级生成查询结果。
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
目录
相关文章
|
14天前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
16天前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
9天前
|
存储 缓存 Cloud Native
云原生时代的架构革新,Apache Doris 存算分离如何实现弹性与性能双重提升
随着云基础设施的成熟,Apache Doris 3.0 正式支持了存算分离全新模式。基于这一架构,能够实现更低成本、极致弹性以及负载隔离。本文将介绍存算分离架构及其优势,并通过导入性能、查询性能、资源成本的测试,直观展现存算分离架构下的性能表现,为读者提供具体场景下的使用参考。
云原生时代的架构革新,Apache Doris 存算分离如何实现弹性与性能双重提升
|
20天前
|
存储 Go
Go 语言入门指南:切片
Golang中的切片(Slice)是基于数组的动态序列,支持变长操作。它由指针、长度和容量三部分组成,底层引用一个连续的数组片段。切片提供灵活的增减元素功能,语法形式为`[]T`,其中T为元素类型。相比固定长度的数组,切片更常用,允许动态调整大小,并且多个切片可以共享同一底层数组。通过内置的`make`函数可创建指定长度和容量的切片。需要注意的是,切片不能直接比较,只能与`nil`比较,且空切片的长度为0。
Go 语言入门指南:切片
|
19天前
|
开发框架 前端开发 Go
eino — 基于go语言的大模型应用开发框架(二)
本文介绍了如何使用Eino框架实现一个基本的LLM(大语言模型)应用。Eino中的`ChatModel`接口提供了与不同大模型服务(如OpenAI、Ollama等)交互的统一方式,支持生成完整响应、流式响应和绑定工具等功能。`Generate`方法用于生成完整的模型响应,`Stream`方法以流式方式返回结果,`BindTools`方法为模型绑定工具。此外,还介绍了通过`Option`模式配置模型参数及模板功能,支持基于前端和用户自定义的角色及Prompt。目前主要聚焦于`ChatModel`的`Generate`方法,后续将继续深入学习。
167 7
|
16天前
|
存储 缓存 监控
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
29 3
|
16天前
|
存储 缓存 安全
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
|
20天前
|
存储 开发框架 Devops
eino — 基于go语言的大模型应用开发框架(一)
Eino 是一个受开源社区优秀LLM应用开发框架(如LangChain和LlamaIndex)启发的Go语言框架,强调简洁性、可扩展性和可靠性。它提供了易于复用的组件、强大的编排框架、简洁明了的API、最佳实践集合及实用的DevOps工具,支持快速构建和部署LLM应用。Eino不仅兼容多种模型库(如OpenAI、Ollama、Ark),还提供详细的官方文档和活跃的社区支持,便于开发者上手使用。
127 8
|
12天前
|
SQL 分布式计算 Apache
Apache Doris 3.0.4 版本正式发布
该版本持续在存算分离、湖仓一体、异步物化视图等方面进行改进提升与问题修复
|
17天前
|
SQL 安全 Java
阿里双十一背后的Go语言实践:百万QPS网关的设计与实现
解析阿里核心网关如何利用Go协程池、RingBuffer、零拷贝技术支撑亿级流量。 重点分享: ① 如何用gRPC拦截器实现熔断限流; ② Sync.Map在高并发读写中的取舍。

推荐镜像

更多