sishen-hbase-ruby 0.5.0 → 1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/hbase-ruby.gemspec +3 -3
- data/lib/hbase/client.rb +2 -1
- data/lib/hbase/model/column_descriptor.rb +1 -1
- data/lib/hbase/operation/row_operation.rb +9 -8
- data/lib/hbase/operation/scanner_operation.rb +4 -2
- data/lib/hbase/operation/table_operation.rb +5 -0
- data/lib/hbase/request/scanner_request.rb +2 -2
- data/lib/hbase/response/meta_response.rb +2 -1
- data/lib/hbase/response/row_response.rb +4 -2
- data/lib/hbase/response/scanner_response.rb +23 -20
- data/lib/hbase/response/table_response.rb +1 -1
- metadata +5 -3
- data/README.txt +0 -65
data/hbase-ruby.gemspec
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = %q{hbase-ruby}
|
3
|
-
s.version = "
|
3
|
+
s.version = "1.0"
|
4
4
|
|
5
5
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
6
6
|
s.authors = ["Ye Dingding"]
|
7
|
-
s.date = %q{
|
7
|
+
s.date = %q{2009-03-08}
|
8
8
|
s.description = %q{hbase-ruby is a pure ruby client for hbase and enable the ruby app enjoy the power of HBase}
|
9
9
|
s.email = %q{yedingding@gmail.com}
|
10
10
|
s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.txt"]
|
11
11
|
s.files = ["History.txt", "MIT-LICENSE", "Manifest.txt", "README.txt", "Rakefile", "hbase-ruby.gemspec", "lib/hbase.rb", "lib/hbase/client.rb", "lib/hbase/exception.rb", "lib/hbase/model.rb", "lib/hbase/model/column.rb", "lib/hbase/model/column_descriptor.rb", "lib/hbase/model/region_descriptor.rb", "lib/hbase/model/row.rb", "lib/hbase/model/table_descriptor.rb", "lib/hbase/model/scanner.rb", "lib/hbase/operation/meta_operation.rb", "lib/hbase/operation/row_operation.rb", "lib/hbase/operation/scanner_operation.rb", "lib/hbase/operation/table_operation.rb", "lib/hbase/request.rb", "lib/hbase/request/basic_request.rb", "lib/hbase/request/meta_request.rb", "lib/hbase/request/row_request.rb", "lib/hbase/request/scanner_request.rb", "lib/hbase/request/table_request.rb", "lib/hbase/response.rb", "lib/hbase/response/basic_response.rb", "lib/hbase/response/meta_response.rb", "lib/hbase/response/row_response.rb", "lib/hbase/response/table_response.rb", "lib/hbase/response/scanner_response.rb"]
|
12
12
|
s.has_rdoc = true
|
13
|
-
s.homepage = %q{http://
|
13
|
+
s.homepage = %q{http://github.com/sishen}
|
14
14
|
s.rdoc_options = ["--main", "README.txt"]
|
15
15
|
s.require_paths = ["lib"]
|
16
16
|
s.rubygems_version = %q{1.2.0}
|
data/lib/hbase/client.rb
CHANGED
@@ -51,12 +51,13 @@ module HBase
|
|
51
51
|
rescue Errno::ECONNREFUSED
|
52
52
|
raise ConnectionNotEstablishedError, "can't connect to #{@url}"
|
53
53
|
rescue Timeout::Error => e
|
54
|
+
puts e.backtrace.join("\n")
|
54
55
|
raise ConnectionTimeoutError, "execution expired. Maybe query disabled tables"
|
55
56
|
end
|
56
57
|
|
57
58
|
case response
|
58
59
|
when Net::HTTPSuccess
|
59
|
-
response.body
|
60
|
+
response.body
|
60
61
|
else
|
61
62
|
response.error!
|
62
63
|
end
|
@@ -18,7 +18,6 @@ module HBase
|
|
18
18
|
request = Request::RowRequest.new(table_name, name, timestamp)
|
19
19
|
row = Response::RowResponse.new(get(request.show(columns, options))).parse
|
20
20
|
row.table_name = table_name
|
21
|
-
row.name = name
|
22
21
|
row.timestamp = timestamp
|
23
22
|
row
|
24
23
|
rescue Net::ProtocolError => e
|
@@ -34,12 +33,14 @@ module HBase
|
|
34
33
|
begin
|
35
34
|
request = Request::RowRequest.new(table_name, name, timestamp)
|
36
35
|
data = []
|
37
|
-
if columns
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
36
|
+
if columns
|
37
|
+
if columns.instance_of? Array
|
38
|
+
data = columns
|
39
|
+
elsif columns.instance_of? Hash
|
40
|
+
data = [columns]
|
41
|
+
else
|
42
|
+
raise StandardError, "Only Array or Hash data accepted"
|
43
|
+
end
|
43
44
|
end
|
44
45
|
xml_data ="<?xml version='1.0' encoding='UTF-8'?><columns>"
|
45
46
|
data.each do |d|
|
@@ -49,7 +50,7 @@ module HBase
|
|
49
50
|
end
|
50
51
|
xml_data << "</columns>"
|
51
52
|
|
52
|
-
|
53
|
+
post(request.create, xml_data)
|
53
54
|
rescue Net::ProtocolError => e
|
54
55
|
if e.to_s.include?("Table")
|
55
56
|
raise TableNotFoundError, "Table '#{table_name}' Not Found"
|
@@ -1,10 +1,12 @@
|
|
1
1
|
module HBase
|
2
2
|
module Operation
|
3
3
|
module ScannerOperation
|
4
|
-
def open_scanner(table_name, columns, start_row = nil,
|
4
|
+
def open_scanner(table_name, columns, start_row = nil, stop_row = nil, timestamp = nil)
|
5
5
|
begin
|
6
6
|
request = Request::ScannerRequest.new(table_name)
|
7
|
-
|
7
|
+
scanner = Response::ScannerResponse.new(post(request.open(columns, start_row, stop_row, timestamp))).parse
|
8
|
+
scanner.table_name = table_name
|
9
|
+
scanner
|
8
10
|
rescue Net::ProtocolError => e
|
9
11
|
if e.to_s.include?("TableNotFoundException")
|
10
12
|
raise TableNotFoundError, "Table #{table_name} Not Found!"
|
@@ -9,11 +9,11 @@ module HBase
|
|
9
9
|
super(path)
|
10
10
|
end
|
11
11
|
|
12
|
-
def open(columns, start_row = nil,
|
12
|
+
def open(columns, start_row = nil, stop_row = nil, timestamp = nil)
|
13
13
|
search = []
|
14
14
|
search << pack_params(columns)
|
15
15
|
search << "start_row=#{CGI.escape(start_row)}" if start_row
|
16
|
-
search << "
|
16
|
+
search << "stop_row=#{CGI.escape(end_row)}" if stop_row
|
17
17
|
search << "timestamp=#{CGI.escape(timestamp)}" if timestamp
|
18
18
|
|
19
19
|
@path << "?" << search.join('&')
|
@@ -20,7 +20,8 @@ module HBase
|
|
20
20
|
entry = doc.elements["tables"]
|
21
21
|
tables = []
|
22
22
|
entry.elements.each("table") do |table|
|
23
|
-
|
23
|
+
name = table.elements["name"].text.strip rescue nil
|
24
|
+
t = Model::TableDescriptor.new(:name => name)
|
24
25
|
tables << t
|
25
26
|
end
|
26
27
|
tables
|
@@ -4,9 +4,11 @@ module HBase
|
|
4
4
|
def parse_content(raw_data)
|
5
5
|
doc = REXML::Document.new(raw_data)
|
6
6
|
row = doc.elements["row"]
|
7
|
+
rname = row.elements["name"].text.strip.unpack("m").first
|
7
8
|
columns = []
|
9
|
+
# Need fix in the server side
|
8
10
|
count = row.elements["count"].text.strip.to_i rescue 0
|
9
|
-
row.elements.each("column") do |col|
|
11
|
+
row.elements["columns"].elements.each("column") do |col|
|
10
12
|
name = col.elements["name"].text.strip.unpack("m").first
|
11
13
|
value = col.elements["value"].text.strip.unpack("m").first rescue nil
|
12
14
|
timestamp = col.elements["timestamp"].text.strip.to_i
|
@@ -14,7 +16,7 @@ module HBase
|
|
14
16
|
:value => value,
|
15
17
|
:timestamp => timestamp)
|
16
18
|
end
|
17
|
-
Model::Row.new(:total_count => count, :columns => columns)
|
19
|
+
Model::Row.new(:name => rname, :total_count => count, :columns => columns)
|
18
20
|
end
|
19
21
|
end
|
20
22
|
end
|
@@ -2,30 +2,33 @@ module HBase
|
|
2
2
|
module Response
|
3
3
|
class ScannerResponse < BasicResponse
|
4
4
|
def parse_content(raw_data)
|
5
|
+
puts raw_data
|
6
|
+
|
5
7
|
doc = REXML::Document.new(raw_data)
|
6
|
-
doc = doc.elements["rows"] if doc.elements["rows"] && doc.elements["rows"].has_elements?
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
9
|
+
if doc.elements["/scanner"] && doc.elements["/scanner"].has_elements?
|
10
|
+
scanner = doc.elements["scanner"]
|
11
|
+
id = scanner.elements["id"].text.strip.to_i
|
12
|
+
Model::Scanner.new(:scanner_id => id)
|
13
|
+
|
14
|
+
elsif doc.elements["rows"] && doc.elements["rows"].has_elements?
|
15
|
+
doc = doc.elements["rows"]
|
16
|
+
rows = []
|
17
|
+
doc.elements.each("row") do |row|
|
18
|
+
row_name = row.elements["name"].text.strip.unpack("m").first
|
19
|
+
columns = []
|
20
|
+
row.elements.each("column") do |col|
|
21
|
+
name = col.elements["name"].text.strip.unpack("m").first
|
22
|
+
value = col.elements["value"].text.strip.unpack("m").first rescue nil
|
23
|
+
timestamp = col.elements["timestamp"].text.strip.to_i
|
24
|
+
columns << Model::Column.new(:name => name,
|
25
|
+
:value => value,
|
26
|
+
:timestamp => timestamp)
|
27
|
+
end
|
28
|
+
rows << Model::Row.new(:name => row_name, :columns => columns)
|
19
29
|
end
|
20
|
-
rows
|
30
|
+
rows
|
21
31
|
end
|
22
|
-
rows
|
23
|
-
end
|
24
|
-
|
25
|
-
def get_scanner_id
|
26
|
-
location = @raw_data['location']
|
27
|
-
paths = location.split('/')
|
28
|
-
Model::Scanner.new(:table_name => paths[2], :scanner_id => paths[4])
|
29
32
|
end
|
30
33
|
end
|
31
34
|
end
|
@@ -12,7 +12,7 @@ module HBase
|
|
12
12
|
compression = columnfamily.elements["compression"].text.strip
|
13
13
|
bloomfilter = columnfamily.elements["bloomfilter"].text.strip.to_b
|
14
14
|
max_versions = columnfamily.elements["max-versions"].text.strip.to_i
|
15
|
-
maximum_cell_size = columnfamily.elements["
|
15
|
+
maximum_cell_size = columnfamily.elements["max-length"].text.strip.to_i
|
16
16
|
|
17
17
|
column_descriptor = Model::ColumnDescriptor.new(:name => colname,
|
18
18
|
:compression => Model::CompressionType.to_compression_type(compression),
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sishen-hbase-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: "1.0"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ye Dingding
|
@@ -9,11 +9,12 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-03-08 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: hoe
|
17
|
+
type: :runtime
|
17
18
|
version_requirement:
|
18
19
|
version_requirements: !ruby/object:Gem::Requirement
|
19
20
|
requirements:
|
@@ -23,6 +24,7 @@ dependencies:
|
|
23
24
|
version:
|
24
25
|
- !ruby/object:Gem::Dependency
|
25
26
|
name: rspec
|
27
|
+
type: :runtime
|
26
28
|
version_requirement:
|
27
29
|
version_requirements: !ruby/object:Gem::Requirement
|
28
30
|
requirements:
|
@@ -74,7 +76,7 @@ files:
|
|
74
76
|
- lib/hbase/response/table_response.rb
|
75
77
|
- lib/hbase/response/scanner_response.rb
|
76
78
|
has_rdoc: true
|
77
|
-
homepage: http://
|
79
|
+
homepage: http://github.com/sishen
|
78
80
|
post_install_message:
|
79
81
|
rdoc_options:
|
80
82
|
- --main
|
data/README.txt
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
hbase-ruby is a pure ruby client for HBase (http://hadoop.apache.org/hbase). It works with the most recent version of HBase REST interface.
|
2
|
-
|
3
|
-
== INSTALLTION
|
4
|
-
|
5
|
-
$gem sources -a http://gems.github.com
|
6
|
-
$gem install sishen-hbase-ruby
|
7
|
-
|
8
|
-
For those who wants to use hbase in their rails application, can add this line to the environment.rb:
|
9
|
-
{{{
|
10
|
-
config.gem 'sishen-hbase-ruby', :lib => "hbase", :source => "http://gems.github.com"
|
11
|
-
}}}
|
12
|
-
|
13
|
-
To build the gem yourself:
|
14
|
-
|
15
|
-
$rake gem
|
16
|
-
|
17
|
-
== USAGE
|
18
|
-
|
19
|
-
First download the recent version of hbase (svn checkout http://svn.apache.org/repos/asf/hadoop/hbase/trunk hbase), compile it with 'ant', then launch HBase server:
|
20
|
-
|
21
|
-
$bin/start-hbase.sh
|
22
|
-
|
23
|
-
Here is the example:
|
24
|
-
{{{
|
25
|
-
require 'hbase'
|
26
|
-
|
27
|
-
client = HBase::Client.new("http://localhost:60010/api") # this url is the default.
|
28
|
-
|
29
|
-
# Table Operation
|
30
|
-
tables = client.list_tables # list available tables
|
31
|
-
table = client.create_table('users', 'habbit') # create a table whose column_family is habbit
|
32
|
-
table = client.show_table('users') # show the meta info of table users
|
33
|
-
client.disable_table('users') # disable table users
|
34
|
-
client.enable_table('users') # enable table users
|
35
|
-
client.delete_table('users') # delete table users
|
36
|
-
|
37
|
-
# Row Operation
|
38
|
-
row = client.show_row('users', 'sishen') # show the data of row 'sishen' in table 'users'
|
39
|
-
row2 = client.create_row('users', 'sishen', Time.now.to_i, {:name => 'habbit:football', :value => 'i like football'}) # create the row 'sishen' with the data in the table 'users'
|
40
|
-
client.delete_row('users', 'sishen', nil, 'habbit:football') # delete the row 'sishen' of table 'users' with the optional column 'habbit:football'
|
41
|
-
|
42
|
-
# Scanner Operation
|
43
|
-
scanner = client.open_scanner('users', 'habbit:')
|
44
|
-
rows = client.get_rows(scanner)
|
45
|
-
client.close_scanner(scanner)
|
46
|
-
}}}
|
47
|
-
|
48
|
-
== Testing
|
49
|
-
|
50
|
-
First you want to install rspec gem:
|
51
|
-
|
52
|
-
{{{
|
53
|
-
sudo gem install rspec
|
54
|
-
}}}
|
55
|
-
|
56
|
-
Now, you can run the spec by following rake task:
|
57
|
-
|
58
|
-
{{{
|
59
|
-
rake examples
|
60
|
-
}}}
|
61
|
-
|
62
|
-
== Copyright
|
63
|
-
|
64
|
-
Copyright (c) 2008 Dingding Ye <yedingding@gmail.com>
|
65
|
-
Distributed under MIT License
|