• 怎么使用 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

    在我们程序里导入依赖库

    1. import (
    2. "database/sql"
    3. "fmt"
    4. _ "github.com/go-sql-driver/mysql"
    5. )

    连接Doris数据库

    1. var (
    2. // 定义一个全局对象db
    3. db *sql.DB
    4. //连接Doris的用户名
    5. userName string = "root"
    6. //连接Doris的密码
    7. password string = ""
    8. //连接Doris的地址
    9. ipAddress string = "127.0.0.1"
    10. //连接Doris的端口号,默认是9030
    11. port int = 9030
    12. //连接Doris的具体数据库名称
    13. dbName string = "test"
    14. )
    15. func initDB() (err error) {
    16. dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", userName, password, ipAddress, port, dbName)
    17. //Open打开一个driverName指定的数据库,dataSourceName指定数据源
    18. //不会校验用户名和密码是否正确,只会对dsn的格式进行检测
    19. db, err = sql.Open("mysql", dsn)
    20. //dsn格式不正确的时候会报错
    21. if err != nil {
    22. return err
    23. }
    24. //尝试与数据库连接,校验dsn是否正确
    25. err = db.Ping()
    26. if err != nil {
    27. fmt.Println("校验失败,err", err)
    28. return err
    29. }
    30. // 设置最大连接数
    31. db.SetMaxOpenConns(50)
    32. // 设置最大的空闲连接数
    33. // db.SetMaxIdleConns(20)
    34. fmt.Println("连接数据库成功!")
    35. return nil
    36. }

    验证连接

    1. func main() {
    2. err := initDB()
    3. if err != nil {
    4. fmt.Println("初始化数据库失败,err", err)
    5. return
    6. }
    7. }

    查询数据表

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

    我的表结构如下:

    1. CREATE TABLE `t_cn_search` (
    2. `md5` varchar(100) NULL,
    3. `book_line` text NULL,
    4. INDEX idx_line (`book_line`) USING INVERTED PROPERTIES("parser" = "chinese", "support_phrase" = "true") COMMENT ''
    5. ) ENGINE=OLAP
    6. DUPLICATE KEY(`md5`)
    7. COMMENT 'OLAP'
    8. DISTRIBUTED BY HASH(`md5`) BUCKETS 2
    9. PROPERTIES (
    10. "replication_allocation" = "tag.location.default: 1",
    11. "is_being_synced" = "false",
    12. "storage_format" = "V2",
    13. "light_schema_change" = "true",
    14. "disable_auto_compaction" = "false",
    15. "enable_single_replica_compaction" = "false"
    16. );

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

    查询程序:

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

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

    插入数据

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

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

    1. mysql> desc function hdfs(
    2. -> "uri" = "hdfs://localhost:9000/tmp/test.parquet",
    3. -> "fs.defaultFS" = "hdfs://localhost:9000",
    4. -> "hadoop.username" = "doris",
    5. -> "format" = "parquet");
    6. +----------------+------+------+-------+---------+-------+
    7. | Field | Type | Null | Key | Default | Extra |
    8. +----------------+------+------+-------+---------+-------+
    9. | date | TEXT | Yes | false | NULL | NONE |
    10. | user_src | TEXT | Yes | false | NULL | NONE |
    11. | order_src | TEXT | Yes | false | NULL | NONE |
    12. | order_location | TEXT | Yes | false | NULL | NONE |
    13. | new_order | INT | Yes | false | NULL | NONE |
    14. | payed_order | INT | Yes | false | NULL | NONE |
    15. | pending_order | INT | Yes | false | NULL | NONE |
    16. | cancel_order | INT | Yes | false | NULL | NONE |
    17. | reject_order | INT | Yes | false | NULL | NONE |
    18. | good_order | INT | Yes | false | NULL | NONE |
    19. | report_order | INT | Yes | false | NULL | NONE |
    20. +----------------+------+------+-------+---------+-------+
    21. 11 rows in set (0.16 sec)

    Doris 的表结构如下:

    1. CREATE TABLE `order_analysis` (
    2. `date` varchar(57) NULL,
    3. `user_src` varchar(27) NULL,
    4. `order_src` varchar(33) NULL,
    5. `order_location` varchar(6) NULL,
    6. `new_order` int(11) NULL,
    7. `payed_order` int(11) NULL,
    8. `pending_order` int(11) NULL,
    9. `cancel_order` int(11) NULL,
    10. `reject_order` int(11) NULL,
    11. `good_order` int(11) NULL,
    12. `report_order` int(11) NULL
    13. ) ENGINE=OLAP
    14. DUPLICATE KEY(`date`)
    15. COMMENT 'OLAP'
    16. DISTRIBUTED BY HASH(`date`) BUCKETS 2
    17. PROPERTIES (
    18. "replication_allocation" = "tag.location.default: 1",
    19. "is_being_synced" = "false",
    20. "storage_format" = "V2",
    21. "light_schema_change" = "true",
    22. "disable_auto_compaction" = "false",
    23. "enable_single_replica_compaction" = "false"
    24. );

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

    1. func insert() {
    2. result, err := db.Exec("insert into order_analysis select * from hdfs(" +
    3. "\"uri\" = \"hdfs://localhost:9000/tmp/test.parquet\"," +
    4. "\"fs.defaultFS\" = \"hdfs://localhost:9000\"," +
    5. "\"hadoop.username\" = \"doris\"," +
    6. "\"format\" = \"parquet\")")
    7. if err != nil {
    8. fmt.Println("预处理失败:", err)
    9. return
    10. }
    11. if err != nil {
    12. fmt.Println("执行预处理失败:", err)
    13. return
    14. } else {
    15. rows, _ := result.RowsAffected()
    16. fmt.Println("执行成功,影响行数", rows, "行")
    17. }
    18. }

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

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

    总结

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

  • 相关阅读:
    中科大遭钓鱼邮件攻击了?3500名师生中招
    内网服务器访问远程服务器的端口映射
    阿里三面:MQ 消息丢失、重复、积压问题,如何解决?
    grafana 通过查询结果设置动态阈值
    Go语言strings标准库
    笨蛋学算法之LeetCodeHot100_3_最长连续序列(Java)
    初始化一个Android项目时,Android Studio会自动生成一些文件和目录结构,以帮助你快速上手开发
    Python安装
    Qt基础学习笔记
    python3通过winrm远程执行windows服务器dos命令
  • 原文地址:https://blog.csdn.net/hf200012/article/details/133387405