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
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,預設密碼不啟用,隨便輸入一個使用者名稱
介面
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