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()