怎么使用 Go 语言操作 Apache Doris

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 怎么使用 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版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
目录
相关文章
|
2月前
|
消息中间件 OLAP Kafka
Apache Doris 实时更新技术揭秘:为何在 OLAP 领域表现卓越?
Apache Doris 为何在 OLAP 领域表现卓越?凭借其主键模型、数据延迟、查询性能、并发处理、易用性等多方面特性的表现,在分析领域展现了独特的实时更新能力。
219 9
|
21天前
|
存储 自然语言处理 分布式计算
Apache Doris 3.1 正式发布:半结构化分析全面升级,湖仓一体能力再跃新高
Apache Doris 3.1 正式发布!全面升级半结构化分析,支持 VARIANT 稀疏列与模板化 Schema,提升湖仓一体能力,增强 Iceberg/Paimon 集成,优化存储引擎与查询性能,助力高效数据分析。
219 4
Apache Doris 3.1 正式发布:半结构化分析全面升级,湖仓一体能力再跃新高
|
6天前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
53 1
|
17天前
|
SQL 人工智能 数据挖掘
Apache Doris 4.0 AI 能力揭秘(二):为企业级应用而生的 AI 函数设计与实践
Apache Doris 4.0 原生集成 LLM 函数,将大语言模型能力深度融入 SQL 引擎,实现文本处理智能化与数据分析一体化。通过十大函数,支持智能客服、内容分析、金融风控等场景,提升实时决策效率。采用资源池化管理,保障数据一致性,降低传输开销,毫秒级完成 AI 分析。结合缓存复用、并行执行与权限控制,兼顾性能、成本与安全,推动数据库向 AI 原生演进。
129 0
Apache Doris 4.0 AI 能力揭秘(二):为企业级应用而生的 AI 函数设计与实践
|
2月前
|
存储 分布式计算 Apache
湖仓一体:小米集团基于 Apache Doris + Apache Paimon 实现 6 倍性能飞跃
小米通过将 Apache Doris(数据库)与 Apache Paimon(数据湖)深度融合,不仅解决了数据湖分析的性能瓶颈,更实现了 “1+1>2” 的协同效应。在这些实践下,小米在湖仓数据分析场景下获得了可观的业务收益。
464 9
湖仓一体:小米集团基于 Apache Doris + Apache Paimon 实现 6 倍性能飞跃
|
2月前
|
人工智能 运维 监控
智能运维与数据治理:基于 Apache Doris 的 Data Agent 解决方案
本文基于 Apache Doris 数据运维治理 Agent 展开讨论,如何让 AI 成为 Doris 数据运维工程师和数据治理专家的智能助手,并在某些场景下实现对人工操作的全面替代。这种变革不仅仅是技术层面的进步,更是数据运维治理思维方式的根本性转变:从“被动响应”到“主动预防”,从“人工判断”到“智能决策”,从“孤立处理”到“协同治理”。
343 11
智能运维与数据治理:基于 Apache Doris 的 Data Agent 解决方案
|
2月前
|
SQL 存储 运维
Apache Doris 在菜鸟的大规模湖仓业务场景落地实践
本文介绍了 Apache Doris 在菜鸟的大规模落地的实践经验,菜鸟为什么选择 Doris,以及 Doris 如何在菜鸟从 0 开始,一步步的验证、落地,到如今上万核的规模,服务于各个业务线,Doris 已然成为菜鸟 OLAP 数据分析的最优选型。
180 2
Apache Doris 在菜鸟的大规模湖仓业务场景落地实践
|
2月前
|
SQL 存储 JSON
Apache Doris 2.1.10 版本正式发布
亲爱的社区小伙伴们,Apache Doris 2.1.10 版本已正式发布。2.1.10 版本对湖仓一体、半结构化数据类型、查询优化器、执行引擎、存储管理进行了若干改进优化。欢迎大家下载使用。
162 5
|
2月前
|
人工智能 自然语言处理 数据挖掘
Apache Doris 4.0 AI 能力揭秘(一):AI 函数之 LLM 函数介绍
在即将发布的 Apache Doris 4.0 版本中,我们正式引入了一系列 LLM 函数,将前沿的 AI 能力与日常的数据分析相结合,无论是精准提取文本信息,还是对评论进行情感分类,亦或生成精炼的文本摘要,皆可在数据库内部无缝完成。
149 0
Apache Doris 4.0 AI 能力揭秘(一):AI 函数之 LLM 函数介绍
|
2月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
238 1

热门文章

最新文章

推荐镜像

更多