RubyからHiveサーバ経由でHiveを使う

HiveサーバはThriftでできてるんで当然Rubyからも使えます。
が、ひどくはまったんでメモしときます。


環境は、CentOS 5.5です。


Thriftのインストール
id:brfrn169:20101010:1286699822


Hiveサーバの立ち上げ方など
id:brfrn169:20100312:1270530644

クライアントコードの生成

まず、http://archive.cloudera.com/cdh/3/ からソースを落としてきます。


落としてきたら、IDLからクライアントコードを生成します。

tar xvzf hive-0.5.0+20.tar.gz 
thrift -gen rb hive-0.5.0+20/src/service/include/thrift/fb303/if/fb303.thrift
thrift -gen rb hive-0.5.0+20/src/ql/if/queryplan.thrift
thrift -gen rb -I hive-0.5.0+20/src/service/include hive-0.5.0+20/src/ql/if/queryplan.thrift
thrift -gen rb -I hive-0.5.0+20/src/ -I hive-0.5.0+20/src/service/include hive-0.5.0+20/src/service/if/hive_service.thrift


一応、落としてきたソースの中にクライアントコードはありますが、
うまく動かなかったので生成しなおしてます。


gen_rb/にコードが吐かれます。

動作テスト

以下のように使えます。

$: << 'gen-rb'

require 'thrift_hive'

transport = Thrift::BufferedTransport.new(Thrift::Socket.new("localhost", 10000))
protocol = Thrift::BinaryProtocol.new(transport)
client = ThriftHive::Client.new(protocol)

transport.open()

client.execute("CREATE TABLE test (a STRING, b STRING, c STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t' STORED AS TEXTFILE")
client.execute("LOAD DATA INPATH 'data' OVERWRITE INTO TABLE test")

client.execute("SELECT * FROM test")
client.fetchAll.each do |row|
  p row
end

client.execute("SELECT count(1) FROM test")
p client.fetchOne

transport.close()