golang odbc mysql_golang使用odbc链接hive

本文详细介绍了如何在Golang中使用ODBC连接Hive,包括安装UnixODBC和相关驱动,配置odbcinst.ini和odbc.ini文件,解决连接问题,并展示了一个Go代码示例来执行查询操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

golang使用odbc链接hive

安装odbc

yum install unixODBC

yum install unixODBC-devel

## mysql driver require

yum install mysql-connector-odbc

## hive driver require

## https://cwiki.apache.org/confluence/display/Hive/HiveODBC

## 官方说不提供hive odbc driver libodbchive.so

There is no ODBC driver available for HiveServer2 as part of Apache Hive. There are third party ODBC drivers available from different vendors, and most of them seem to be free.

下载ClouderaHiveODBC-2.5.20.1006-1.el7.x86_64.rpm并安装

$ rpm -ivh ClouderaHiveODBC-2.5.20.1006-1.el7.x86_64.rpm

error: Failed dependencies:

cyrus-sasl-gssapi(x86-64) >= 2.1.26 is needed by ClouderaHiveODBC-2.5.20.1006-1.x86_64

cyrus-sasl-plain(x86-64) >= 2.1.26 is needed by ClouderaHiveODBC-2.5.20.1006-1.x86_64

$ yum install cyrus-sasl-gssapi

$ yum install cyrus-sasl-plain

# 重新安装

$ rpm -ivh ClouderaHiveODBC-2.5.20.1006-1.el7.x86_64.rpm

配置

配置odbcinst.ini - 已经自动生成,不用配置

配置odbc.ini

vim /etc/odbc.ini

[Cloudera_HIVE]

Driver=/opt/cloudera/hiveodbc/lib/64/libclouderahiveodbc64.so

Description=Hive Cloudera ODBC Driver

Host=

Port=

Schema=

ServiceDiscoveryMode=0

ZKNamespace=

HiveServerType=2

#AuthMech=3

# 0=NOSASL 测试通过

AuthMech=0

ThriftTransport=1

UseNativeQuery=0

UID=cloudera

在/etc/odbcinst.ini中增加调试:

[ODBC]

Trace=Yes

TraceFile=/tmp/odbc.trace.log

测试链接

格式 isql {dsnname}

dnsname就是/etc/odbc.ini中的块名称

$ isql Cloudera_HIVE +---------------------------------------+

| Connected! |

| |

| sql-statement |

| help [tablename] |

| quit |

| | +---------------------------------------+

SQL>

go链接

使用gohive “github.com/weigj/go-odbc” 可以顺利连接hive.

// Open

conn, err = gohive.Connect("DSN="+"ClouderaHive")

// 直接执行的提交

_, err := conn.ExecDirect("use "+hiveDbname)

// 查询

stmt, err := conn.Prepare(queryStr)

stmt.Execute()

// 获取列

colNum, err := op.NumFields()

var heads []string

for i:=0; i

// 注意取列要从下标1开始

cols, err := op.FieldMetadata(i+1)

heads = append(heads, cols.Name)

}

log.Printf("heads=%v", heads)

// 获取结果

rets, err := stmt.FetchAll()

log.Printf("rets=%v", rets)

// Close

stmt.Close()

conn.Close()

问题及解决方案

测试发现isql可以连接本机,不能连接网络中的mysql服务器。mysql命令可以连接上网络中的mysql服务器。

遇到问题:

/etc/odbc.ini中,UserName字段无效,使用User字段代替。

遇到问题:

AuthMech要设置成0,0=NOSASL

使用gohive “github.com/weigj/go-odbc” 可以顺利连接hive. 遇到问题: gohive.stmt.Prepare,Fetch,FetchAll等接口都返回不为nil的空err,需要手动处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值