Presto學習筆記——Go客戶端連線Presto

tonglin0325發表於2024-05-12

1.查詢PrestoDB(facebook版本)

1.建立PrestoDB環境

使用docker建立presto測試環境

https://hub.docker.com/r/prestodb/presto/tags

拉取映象

docker pull prestodb/presto:0.284

啟動

docker run -p 8080:8080 -ti -v /Users/lintong/Downloads/config.properties:/opt/presto-server/etc/config.properties -v /Users/lintong/Downloads/jvm.config:/opt/presto-server/etc/jvm.config prestodb/presto:0.284

其中config.properties配置檔案

coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8080
query.max-memory=5GB
query.max-memory-per-node=1GB
discovery-server.enabled=true
discovery.uri=http://localhost:8080

jvm.config

-server
-Xmx4G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
-Djdk.attach.allowAttachSelf=true

配置參考:https://github.com/prestodb/presto/tree/master/docker/etc

https://prestodb.github.io/docs/current/installation/deployment.html

訪問localhost:8080

Presto學習筆記——Go客戶端連線Presto

2.使用client連線PrestoDB

可以使用presto-go-client,官方文件

https://github.com/prestodb/presto-go-client

引入依賴

go get github.com/prestodb/presto-go-client/presto

go連線資料庫使用的是database/sql,還需要額外引入具體資料庫的driver,比如

presto的github.com/prestodb/presto-go-client/presto

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

impala的github.com/bippio/go-impala

查詢presto程式碼

import (
	"database/sql"
	"fmt"
	_ "github.com/prestodb/presto-go-client/presto"
)

func main() {
	dsn := "http://user@localhost:8080?catalog=default&schema=test"
	db, err := sql.Open("presto", dsn)
	if err != nil {
		fmt.Println(err)
	}
	rows, err := db.Query("SELECT name, age FROM foobar WHERE id=?")
	if err != nil {
		fmt.Println(err)
 	}

	// 迭代結果行
	for rows.Next() {
		var col1 string
		var col2 int
		if err := rows.Scan(&col1, &col2); err != nil {
			fmt.Println("掃描行失敗:", err)
			return
		}
		fmt.Println(col1, col2)
	}
}

參考:golang+presto查詢在資料平臺中ad hoc查詢

如果想同時查詢多行的話,也可以先定義一個struct

type YourTable struct {
  Col1 string
  Col2 int
  Col3 float64
  // 其他列...
}

然後在迭代查詢的時候使用這個struct

// 迭代結果行
for rows.Next() {
  var row YourTable
  if err := rows.Scan(&row.Col1, &row.Col2, &row.Col3); err != nil {
    fmt.Println("掃描行失敗:", err)
    return
  }
  fmt.Println(row)
}

3.使用REST API連線PrestoDB

參考官方文件

https://prestodb.io/docs/current/develop/client-protocol.html

其實presto-go-client底層也是使用presto的REST API的POST請求來提交任務,參考原始碼

https://github.com/prestodb/presto-go-client/tree/master/presto#L635

2.查詢Trino(社群版本)

1.建立Trino環境

建立Trino環境用於測試可以使用docker

https://hub.docker.com/r/trinodb/trino/tags

拉取映象

docker pull trinodb/trino:435

啟動

docker run -p 8080:8080 -ti trinodb/trino:435

訪問localhost:8080,預設密碼不啟用,隨便輸入一個使用者名稱

Presto學習筆記——Go客戶端連線Presto

介面

Presto學習筆記——Go客戶端連線Presto

2.使用client連線trino

可以使用trino-go-client,官方文件

https://github.com/trinodb/trino-go-client

引入依賴

go get github.com/trinodb/trino-go-client/trino

查詢trino程式碼

import (
	"database/sql"
	"fmt"
)
import _ "github.com/trinodb/trino-go-client/trino"

func main() {
	dsn := "http://user@localhost:8080?catalog=default&schema=test"
	db, err := sql.Open("trino", dsn)
	if err != nil {
		fmt.Println(err)
	}
	db.Query("SELECT * FROM foobar WHERE id=?", 1, sql.Named("X-Trino-User", string("Alice")))
}

3.使用REST API連線TrinoDB

參考官方文件

https://trino.io/docs/current/develop/client-protocol.html

其實trino-go-client底層也是使用trino的REST API的POST請求來提交任務,參考原始碼

https://github.com/trinodb/trino-go-client/blob/master/trino/trino.go#L820

相關文章