hbase-jruby 0.1.1-java → 0.1.2-java
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +17 -0
- data/README.md +126 -33
- data/hbase-jruby.gemspec +1 -0
- data/lib/hbase-jruby/admin.rb +1 -0
- data/lib/hbase-jruby/cell.rb +3 -11
- data/lib/hbase-jruby/result.rb +27 -51
- data/lib/hbase-jruby/scoped/aggregation.rb +47 -0
- data/lib/hbase-jruby/scoped.rb +51 -23
- data/lib/hbase-jruby/table.rb +72 -66
- data/lib/hbase-jruby/util.rb +12 -5
- data/lib/hbase-jruby/version.rb +1 -1
- data/lib/hbase-jruby.rb +1 -0
- data/test/helper.rb +1 -3
- data/test/test_aggregation.rb +40 -0
- data/test/test_cell.rb +0 -1
- data/test/test_hbase.rb +1 -1
- data/test/test_scoped.rb +45 -1
- data/test/test_table.rb +46 -11
- data/test/test_table_admin.rb +22 -0
- data/test/test_util.rb +2 -3
- metadata +37 -27
data/CHANGELOG.md
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
Changelog
|
2
|
+
=========
|
3
|
+
|
4
|
+
0.1.2
|
5
|
+
-----
|
6
|
+
|
7
|
+
- Dropped Bignum support. Automatic conversion from Fixnum to Bignum (or vice versa)
|
8
|
+
will produce columns whose values are of heterogeneous types, that are impossible to be read in a consistent way.
|
9
|
+
You can use BigDecimal type instead for large numbers.
|
10
|
+
- Added `HBase::Scoped#while` which allows early termination of scan
|
11
|
+
with [WhileMatchFilter](http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/filter/WhileMatchFilter.html)
|
12
|
+
- Filtering with regular expressions
|
13
|
+
- Implemented comparator for `HBase::Result`
|
14
|
+
- Added coprocessor administration methods
|
15
|
+
- Basic aggregation with Coprocessor
|
16
|
+
- `HBase::Scoped#count` with block
|
17
|
+
- Allows PUT operation with timestamps
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@ Anyhow, JRuby is Ruby, not Java, right?
|
|
9
9
|
|
10
10
|
*hbase-jruby* provides the followings:
|
11
11
|
- Easy, Ruby-esque interface for the fundamental HBase operations
|
12
|
-
- ActiveRecord-like method chaining for
|
12
|
+
- ActiveRecord-like method chaining for data retrieval
|
13
13
|
- Automatic Hadoop/HBase dependency resolution
|
14
14
|
|
15
15
|
## A quick example
|
@@ -17,6 +17,8 @@ Anyhow, JRuby is Ruby, not Java, right?
|
|
17
17
|
```ruby
|
18
18
|
require 'hbase-jruby'
|
19
19
|
|
20
|
+
HBase.resolve_dependency! 'cdh4.1.2'
|
21
|
+
|
20
22
|
hbase = HBase.new
|
21
23
|
table = hbase.table(:test_table)
|
22
24
|
|
@@ -25,16 +27,17 @@ table.put :rowkey1 => { 'cf1:a' => 100, 'cf2:b' => "Hello" }
|
|
25
27
|
|
26
28
|
# GET
|
27
29
|
row = table.get(:rowkey1)
|
28
|
-
number = row.
|
30
|
+
number = row.fixnum('cf1:a')
|
29
31
|
string = row.string('cf1:b')
|
30
32
|
|
31
33
|
# SCAN
|
32
34
|
table.range('rowkey1'..'rowkey9').
|
33
35
|
filter('cf1:a' => 100..200, # cf1:a between 100 and 200
|
34
|
-
'
|
35
|
-
'cf2:c' =>
|
36
|
+
'cf1:b' => 'Hello', # cf1:b = 'Hello'
|
37
|
+
'cf2:c' => /world/i). # cf2:c matches /world/i
|
38
|
+
'cf2:d' => ['foo', /^BAR/i], # cf2:d = 'foo' OR matches /^BAR/i
|
36
39
|
project('cf1:a', 'cf2').each do |row|
|
37
|
-
puts row.
|
40
|
+
puts row.fixnum('cf1:a')
|
38
41
|
end
|
39
42
|
|
40
43
|
# DELETE
|
@@ -174,6 +177,14 @@ table.put 'rowkey1', 'cf1:col1' => "Hello", 'cf2:col2' => "World"
|
|
174
177
|
table.put 'rowkey1' => { 'cf1:col1' => "Hello", 'cf2:col2' => "World" },
|
175
178
|
'rowkey2' => { 'cf1:col1' => "Howdy", 'cf2:col2' => "World" },
|
176
179
|
'rowkey3' => { 'cf1:col1' => "So long", 'cf2:col2' => "World" }
|
180
|
+
|
181
|
+
# Putting values with timestamps
|
182
|
+
table.put 'rowkey1' => {
|
183
|
+
'cf1:col1' => {
|
184
|
+
1353143856665 => "Hello",
|
185
|
+
1352978648642 => "Goodbye" },
|
186
|
+
'cf2:col2' => "World"
|
187
|
+
}
|
177
188
|
```
|
178
189
|
|
179
190
|
### GET
|
@@ -191,12 +202,12 @@ rowk = row.rowkey
|
|
191
202
|
col0 = row.raw 'cf1:col0'
|
192
203
|
|
193
204
|
# Decode column values
|
194
|
-
col1 = row.string
|
195
|
-
col2 = row.fixnum
|
196
|
-
col3 = row.
|
197
|
-
col4 = row.float
|
198
|
-
col5 = row.boolean
|
199
|
-
col6 = row.symbol
|
205
|
+
col1 = row.string 'cf1:col1'
|
206
|
+
col2 = row.fixnum 'cf1:col2'
|
207
|
+
col3 = row.bigdecimal 'cf1:col3'
|
208
|
+
col4 = row.float 'cf1:col4'
|
209
|
+
col5 = row.boolean 'cf1:col5'
|
210
|
+
col6 = row.symbol 'cf1:col6'
|
200
211
|
|
201
212
|
# Decode multiple columns at once
|
202
213
|
row.string ['cf1:str1', 'cf1:str2']
|
@@ -225,13 +236,13 @@ row.strings ['cf1:str1', 'cf1:str2']
|
|
225
236
|
# ]
|
226
237
|
|
227
238
|
# Plural-form methods are provided for any other data types as well
|
228
|
-
cols0 = row.raws
|
229
|
-
cols1 = row.strings
|
230
|
-
cols2 = row.fixnums
|
231
|
-
cols3 = row.
|
232
|
-
cols4 = row.floats
|
233
|
-
cols5 = row.booleans
|
234
|
-
cols6 = row.symbols
|
239
|
+
cols0 = row.raws 'cf1:col0'
|
240
|
+
cols1 = row.strings 'cf1:col1'
|
241
|
+
cols2 = row.fixnums 'cf1:col2'
|
242
|
+
cols3 = row.bigdecimals 'cf1:col3'
|
243
|
+
cols4 = row.floats 'cf1:col4'
|
244
|
+
cols5 = row.booleans 'cf1:col5'
|
245
|
+
cols6 = row.symbols 'cf1:col6'
|
235
246
|
```
|
236
247
|
|
237
248
|
#### Intra-row scan
|
@@ -262,7 +273,7 @@ end
|
|
262
273
|
schema = {
|
263
274
|
'cf1:col1' => :string,
|
264
275
|
'cf1:col2' => :fixnum,
|
265
|
-
'cf1:col3' => :
|
276
|
+
'cf1:col3' => :bigdecimal,
|
266
277
|
'cf1:col4' => :float,
|
267
278
|
'cf1:col5' => :boolean,
|
268
279
|
'cf1:col6' => :symbol }
|
@@ -359,6 +370,7 @@ table.range('A'..'Z'). # Row key range,
|
|
359
370
|
filter('cf2:d' => 100..200). # Range filter on cf2:d
|
360
371
|
filter('cf2:e' => [10, 20..30]). # Set-inclusion condition on cf2:e
|
361
372
|
filter(RandomRowFilter.new(0.5)). # Any Java HBase filter
|
373
|
+
while('cf2:f' => { ne: 'OPEN' }). # Early termination of scan
|
362
374
|
limit(10). # Limits the size of the result set
|
363
375
|
versions(2). # Only fetches 2 versions for each value
|
364
376
|
batch(100). # Batch size for scan set to 100
|
@@ -366,7 +378,7 @@ table.range('A'..'Z'). # Row key range,
|
|
366
378
|
to_a # To Array
|
367
379
|
```
|
368
380
|
|
369
|
-
### range
|
381
|
+
### *range*
|
370
382
|
|
371
383
|
`HBase::Scoped#range` method is used to filter rows based on their row keys.
|
372
384
|
|
@@ -416,7 +428,7 @@ scope.range(1, 100).
|
|
416
428
|
# Same as `scope.range(1, 1000)`
|
417
429
|
```
|
418
430
|
|
419
|
-
### filter
|
431
|
+
### *filter*
|
420
432
|
|
421
433
|
You can configure server-side filtering of rows and columns with `HBase::Scoped#filter` calls.
|
422
434
|
Multiple calls have conjunctive effects.
|
@@ -424,22 +436,56 @@ Multiple calls have conjunctive effects.
|
|
424
436
|
```ruby
|
425
437
|
# Range scanning the table with filters
|
426
438
|
table.range(nil, 1000).
|
427
|
-
filter(
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
439
|
+
filter(
|
440
|
+
# Numbers and characters: Checks if the value is equal to the given value
|
441
|
+
'cf1:a' => 'Hello',
|
442
|
+
'cf1:b' => 1024,
|
443
|
+
|
444
|
+
# Range of numbers or characters: Checks if the value falls within the range
|
445
|
+
'cf1:c' => 100..200,
|
446
|
+
'cf1:d' => 'A'..'C',
|
447
|
+
|
448
|
+
# Regular expression: Checks if the value matches the regular expression
|
449
|
+
'cf1:e' => /world$/i,
|
450
|
+
|
451
|
+
# Hash: Tests the value with 6 types of operators (:gt, :lt, :gte, :lte, :eq, :ne)
|
452
|
+
'cf1:f' => { gt: 1000, lte: 2000 },
|
453
|
+
'cf1:g' => { ne: 1000 },
|
454
|
+
|
455
|
+
# Array of the aforementioned types: OR condition (disjunctive)
|
456
|
+
'cf1:h' => %w[A B C],
|
457
|
+
'cf1:i' => ['A'...'B', 'C', /^D/, { lt: 'F' }]).
|
458
|
+
|
459
|
+
# Multiple calls for conjunctive filtering
|
460
|
+
filter('cf1:j' => ['Alice'..'Bob', 'Cat']).
|
461
|
+
|
462
|
+
# Any number of Java filters can be applied
|
435
463
|
filter(org.apache.hadoop.hbase.filter.RandomRowFilter.new(0.5)).
|
436
|
-
|
437
|
-
each do |record|
|
464
|
+
each do |record|
|
438
465
|
# ...
|
439
466
|
end
|
440
467
|
```
|
441
468
|
|
442
|
-
###
|
469
|
+
### *while*
|
470
|
+
|
471
|
+
`HBase::Scoped#while` method takes the same parameters as `filter` method, the difference is that
|
472
|
+
each filtering condition passed to `while` method is wrapped by `WhileMatchFilter`,
|
473
|
+
which aborts scan immediately when the condition is not met at a certain row.
|
474
|
+
See the following example.
|
475
|
+
|
476
|
+
```ruby
|
477
|
+
(0...30).each do |idx|
|
478
|
+
table.put idx, 'cf1:a' => idx % 10
|
479
|
+
end
|
480
|
+
|
481
|
+
table.filter('cf1:a' => { lte: 1 }).to_a
|
482
|
+
# 0, 1, 10, 11, 20, 21
|
483
|
+
table.while('cf1:a' => { lte: 1 }).to_a
|
484
|
+
# 0, 1
|
485
|
+
# Scan terminates immediately when condition not met.
|
486
|
+
```
|
487
|
+
|
488
|
+
### *project*
|
443
489
|
|
444
490
|
`HBase::Scoped#project` allows you to fetch only a subset of columns from each row.
|
445
491
|
Multiple calls have additive effects.
|
@@ -521,6 +567,44 @@ end
|
|
521
567
|
scoped.count
|
522
568
|
```
|
523
569
|
|
570
|
+
## Basic aggregation using coprocessor
|
571
|
+
|
572
|
+
*hbase-jruby* provides a few basic aggregation methods using
|
573
|
+
the built-in coprocessor called
|
574
|
+
`org.apache.hadoop.hbase.coprocessor.AggregateImplementation`.
|
575
|
+
|
576
|
+
To enable this feature, call `enable_aggregation!` method,
|
577
|
+
which will first disable the table, add the coprocessor, then enable it.
|
578
|
+
|
579
|
+
```ruby
|
580
|
+
table.enable_aggregation!
|
581
|
+
# Just a shorthand notation for
|
582
|
+
# table.add_coprocessor! 'org.apache.hadoop.hbase.coprocessor.AggregateImplementation'
|
583
|
+
```
|
584
|
+
|
585
|
+
Then you can get the sum, average, minimum, maximum, row count, and standard deviation
|
586
|
+
of the projected columns.
|
587
|
+
|
588
|
+
```ruby
|
589
|
+
# cf1:a must hold 8-byte integer values
|
590
|
+
table.project('cf1:a').aggregate(:sum)
|
591
|
+
table.project('cf1:a').aggregate(:avg)
|
592
|
+
table.project('cf1:a').aggregate(:min)
|
593
|
+
table.project('cf1:a').aggregate(:max)
|
594
|
+
table.project('cf1:a').aggregate(:std)
|
595
|
+
table.project('cf1:a').aggregate(:row_count)
|
596
|
+
|
597
|
+
# Aggregation of multiple columns
|
598
|
+
table.project('cf1:a', 'cf1:b').aggregate(:sum)
|
599
|
+
```
|
600
|
+
|
601
|
+
By default, aggregate method assumes the column values are 8-byte integers.
|
602
|
+
For types other than that, you can pass your own ColumnInterpreter.
|
603
|
+
|
604
|
+
```ruby
|
605
|
+
table.project('cf1:b').aggregate(:sum, MyColumnInterpreter.new)
|
606
|
+
```
|
607
|
+
|
524
608
|
## Advanced topics
|
525
609
|
|
526
610
|
### Lexicographic scan order
|
@@ -556,7 +640,6 @@ table.get('rowkey').string(HBase::ColumnKey(:cf1, 100))
|
|
556
640
|
# ...
|
557
641
|
```
|
558
642
|
|
559
|
-
|
560
643
|
### Table administration
|
561
644
|
|
562
645
|
`HBase#Table` provides a few *synchronous* table administration methods.
|
@@ -588,6 +671,16 @@ table.alter_family! :cf2, :bloomfilter => :rowcol
|
|
588
671
|
|
589
672
|
# Remove column family
|
590
673
|
table.delete_family! :cf1
|
674
|
+
|
675
|
+
# Add Coprocessor
|
676
|
+
unless table.has_coprocessor?(cp_class_name1)
|
677
|
+
table.add_coprocessor! cp_class_name1
|
678
|
+
end
|
679
|
+
table.add_coprocessor! cp_class_name2,
|
680
|
+
:path => path, :priority => priority, :params => params
|
681
|
+
|
682
|
+
# Remove coprocessor
|
683
|
+
table.remove_coprocessor! cp_class_name1
|
591
684
|
```
|
592
685
|
|
593
686
|
You can perform other types of administrative tasks
|
data/hbase-jruby.gemspec
CHANGED
@@ -12,6 +12,7 @@ Gem::Specification.new do |gem|
|
|
12
12
|
gem.summary = %q{Ruby-esque interface for accessing HBase from JRuby}
|
13
13
|
gem.homepage = "https://github.com/junegunn/hbase-jruby"
|
14
14
|
gem.platform = 'java'
|
15
|
+
gem.license = 'MIT'
|
15
16
|
|
16
17
|
gem.files = `git ls-files`.split($/)
|
17
18
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
data/lib/hbase-jruby/admin.rb
CHANGED
data/lib/hbase-jruby/cell.rb
CHANGED
@@ -14,7 +14,7 @@ class Cell
|
|
14
14
|
|
15
15
|
# Returns the rowkey of the cell decoded as the given type
|
16
16
|
# @param [Symbol] type The type of the rowkey.
|
17
|
-
# Can be one of :string, :symbol, :fixnum, :float, :
|
17
|
+
# Can be one of :string, :symbol, :fixnum, :float, :bigdecimal, :boolean and :raw.
|
18
18
|
# @return [String, byte[]]
|
19
19
|
def rowkey type = :string
|
20
20
|
Util.from_bytes type, @java.getRow
|
@@ -35,7 +35,7 @@ class Cell
|
|
35
35
|
|
36
36
|
# Returns the column qualifier of the cell
|
37
37
|
# @param [Symbol] type The type of the qualifier.
|
38
|
-
# Can be one of :string, :symbol, :fixnum, :float, :
|
38
|
+
# Can be one of :string, :symbol, :fixnum, :float, :bigdecimal, :boolean and :raw.
|
39
39
|
# @return [Object]
|
40
40
|
def qualifier type = :string
|
41
41
|
Util.from_bytes type, @java.getQualifier
|
@@ -49,7 +49,7 @@ class Cell
|
|
49
49
|
end
|
50
50
|
alias ts timestamp
|
51
51
|
|
52
|
-
# Returns the value of the cell as a Java byte array
|
52
|
+
# Returns the value of the cell as a Java byte array
|
53
53
|
# @return [byte[]]
|
54
54
|
def value
|
55
55
|
@java.getValue
|
@@ -78,14 +78,6 @@ class Cell
|
|
78
78
|
alias integer fixnum
|
79
79
|
alias int fixnum
|
80
80
|
|
81
|
-
# Returns the column value as a Bignum
|
82
|
-
# @return [Bignum]
|
83
|
-
def bignum
|
84
|
-
Util.from_bytes :bignum, value
|
85
|
-
end
|
86
|
-
alias biginteger bignum
|
87
|
-
alias bigint bignum
|
88
|
-
|
89
81
|
# Returns the column value as a BigDecimal
|
90
82
|
# @return [BigDecimal]
|
91
83
|
def bigdecimal
|
data/lib/hbase-jruby/result.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'bigdecimal'
|
2
2
|
|
3
|
-
# Represents a row returned by HBase
|
4
3
|
class HBase
|
4
|
+
# Represents a row returned by HBase
|
5
5
|
# @author Junegunn Choi <junegunn.c@gmail.com>
|
6
6
|
class Result
|
7
7
|
include Enumerable
|
8
|
-
|
8
|
+
|
9
9
|
# Returns the rowkey of the row
|
10
10
|
# @param [Symbol] type The type of the rowkey
|
11
|
-
# Can be one of :string, :symbol, :fixnum, :float, :
|
11
|
+
# Can be one of :string, :symbol, :fixnum, :float, :bigdecimal, :boolean and :raw.
|
12
12
|
# @return [String, byte[]]
|
13
13
|
def rowkey type = :string
|
14
14
|
Util.from_bytes type, @result.getRow
|
@@ -55,7 +55,7 @@ class Result
|
|
55
55
|
name = ColumnKey.new(cf, cq)
|
56
56
|
type = schema[name]
|
57
57
|
|
58
|
-
ret[name] =
|
58
|
+
ret[name] =
|
59
59
|
Hash[
|
60
60
|
tsmap.map { |ts, val|
|
61
61
|
[ ts, type ? Util.from_bytes(type, val) : val ]
|
@@ -71,7 +71,7 @@ class Result
|
|
71
71
|
# @param [String, HBase::ColumnKey] column "FAMILY:QUALIFIER" expression or ColumnKey object.
|
72
72
|
# @return [byte[]] Byte array representation of the latest value
|
73
73
|
# @overload raw(columns)
|
74
|
-
# For each column specified,
|
74
|
+
# For each column specified,
|
75
75
|
# returns the latest column value as a byte array
|
76
76
|
# @param [<String|HBase::ColumnKey>] column "FAMILY:QUALIFIER" expression or ColumnKey object.
|
77
77
|
# @return [Array<byte[]>] Byte array representations of the latest values
|
@@ -91,7 +91,7 @@ class Result
|
|
91
91
|
# @param [String, HBase::ColumnKey] column "FAMILY:QUALIFIER" expression or ColumnKey object.
|
92
92
|
# @return [Hash<Fixnum, byte[]>]
|
93
93
|
# @overload raws(columns)
|
94
|
-
# For each column specified,
|
94
|
+
# For each column specified,
|
95
95
|
# returns all versions of column values as byte arrays in a Hash indexed by their timestamps
|
96
96
|
# @param [Array<String|HBase::ColumnKey>] columns Array of "FAMILY:QUALIFIER" expressions and ColumnKey objects.
|
97
97
|
# @return [Array<Hash<Fixnum, byte[]>>]
|
@@ -111,7 +111,7 @@ class Result
|
|
111
111
|
# @param [String, HBase::ColumnKey] column "FAMILY:QUALIFIER" expression or ColumnKey object.
|
112
112
|
# @return [String]
|
113
113
|
# @overload string(columns)
|
114
|
-
# For each column specified,
|
114
|
+
# For each column specified,
|
115
115
|
# returns the latest column value as a String
|
116
116
|
# @param [Array<String|HBase::ColumnKey>] columns Array of "FAMILY:QUALIFIER" expressions and ColumnKey objects.
|
117
117
|
# @return [Array<String>]
|
@@ -125,7 +125,7 @@ class Result
|
|
125
125
|
# @param [String, HBase::ColumnKey] column "FAMILY:QUALIFIER" expression or ColumnKey object.
|
126
126
|
# @return [Hash<Fixnum, String>]
|
127
127
|
# @overload strings(columns)
|
128
|
-
# For each column specified,
|
128
|
+
# For each column specified,
|
129
129
|
# returns all versions of column values as Strings in a Hash indexed by their timestamps
|
130
130
|
# @param [Array<String|HBase::ColumnKey>] columns Array of "FAMILY:QUALIFIER" expressions and ColumnKey objects.
|
131
131
|
# @return [Array<Hash<Fixnum, String>>]
|
@@ -139,7 +139,7 @@ class Result
|
|
139
139
|
# @param [String, HBase::ColumnKey] column "FAMILY:QUALIFIER" expression or ColumnKey object.
|
140
140
|
# @return [Symbol]
|
141
141
|
# @overload symbol(columns)
|
142
|
-
# For each column specified,
|
142
|
+
# For each column specified,
|
143
143
|
# returns the latest column values as a Symbol
|
144
144
|
# @param [Array<String|HBase::ColumnKey>] columns Array of "FAMILY:QUALIFIER" expressions and ColumnKey objects.
|
145
145
|
# @return [Array<Symbol>]
|
@@ -153,7 +153,7 @@ class Result
|
|
153
153
|
# @param [String, HBase::ColumnKey] column "FAMILY:QUALIFIER" expression or ColumnKey object.
|
154
154
|
# @return [Hash<Fixnum, Symbol>]
|
155
155
|
# @overload symbols(columns)
|
156
|
-
# For each column specified,
|
156
|
+
# For each column specified,
|
157
157
|
# returns all versions of column values as Symbols in a Hash indexed by their timestamps
|
158
158
|
# @param [Array<String|HBase::ColumnKey>] columns Array of "FAMILY:QUALIFIER" expressions and ColumnKey objects.
|
159
159
|
# @return [Array<Hash<Fixnum, Symbol>>]
|
@@ -167,7 +167,7 @@ class Result
|
|
167
167
|
# @param [String, HBase::ColumnKey] column "FAMILY:QUALIFIER" expression or ColumnKey object.
|
168
168
|
# @return [Fixnum]
|
169
169
|
# @overload fixnum(columns)
|
170
|
-
# For each column specified,
|
170
|
+
# For each column specified,
|
171
171
|
# returns the latest column values as a Fixnum
|
172
172
|
# @param [Array<String|HBase::ColumnKey>] columns Array of "FAMILY:QUALIFIER" expressions and ColumnKey objects.
|
173
173
|
# @return [Array<Fixnum>]
|
@@ -182,7 +182,7 @@ class Result
|
|
182
182
|
# @param [String, HBase::ColumnKey] column "FAMILY:QUALIFIER" expression or ColumnKey object.
|
183
183
|
# @return [Hash<Fixnum, Fixnum>]
|
184
184
|
# @overload fixnums(columns)
|
185
|
-
# For each column specified,
|
185
|
+
# For each column specified,
|
186
186
|
# returns all versions of column values as Fixnums in a Hash indexed by their timestamps
|
187
187
|
# @param [Array<String|HBase::ColumnKey>] columns Array of "FAMILY:QUALIFIER" expressions and ColumnKey objects.
|
188
188
|
# @return [Array<Hash<Fixnum, Fixnum>>]
|
@@ -192,42 +192,12 @@ class Result
|
|
192
192
|
alias integers fixnums
|
193
193
|
alias ints fixnums
|
194
194
|
|
195
|
-
# @overload bignum(column)
|
196
|
-
# Returns the latest column value as a Bignum
|
197
|
-
# @param [String, HBase::ColumnKey] column "FAMILY:QUALIFIER" expression or ColumnKey object.
|
198
|
-
# @return [Bignum]
|
199
|
-
# @overload bignum(columns)
|
200
|
-
# For each column specified,
|
201
|
-
# returns the latest column values as a Bignum
|
202
|
-
# @param [Array<String|HBase::ColumnKey>] columns Array of "FAMILY:QUALIFIER" expressions and ColumnKey objects.
|
203
|
-
# @return [Array<Bignum>]
|
204
|
-
def bignum cols
|
205
|
-
decode_values :bignum, cols
|
206
|
-
end
|
207
|
-
alias biginteger bignum
|
208
|
-
alias bigint bignum
|
209
|
-
|
210
|
-
# @overload bignums(column)
|
211
|
-
# Returns all versions of column values as Bignums in a Hash indexed by their timestamps
|
212
|
-
# @param [String, HBase::ColumnKey] column "FAMILY:QUALIFIER" expression or ColumnKey object.
|
213
|
-
# @return [Hash<Fixnum, Bignum>]
|
214
|
-
# @overload bignums(columns)
|
215
|
-
# For each column specified,
|
216
|
-
# returns all versions of column values as Bignums in a Hash indexed by their timestamps
|
217
|
-
# @param [Array<String|HBase::ColumnKey>] columns Array of "FAMILY:QUALIFIER" expressions and ColumnKey objects.
|
218
|
-
# @return [Array<Hash<Fixnum, Bignum>>]
|
219
|
-
def bignums cols
|
220
|
-
decode_values :bignum, cols, true
|
221
|
-
end
|
222
|
-
alias bigintegers bignums
|
223
|
-
alias bigints bignums
|
224
|
-
|
225
195
|
# @overload bigdecimal(column)
|
226
196
|
# Returns the latest column value as a BigDecimal
|
227
197
|
# @param [String, HBase::ColumnKey] column "FAMILY:QUALIFIER" expression or ColumnKey object.
|
228
198
|
# @return [BigDecimal]
|
229
199
|
# @overload bigdecimal(columns)
|
230
|
-
# For each column specified,
|
200
|
+
# For each column specified,
|
231
201
|
# returns the latest column values as a BigDecimal
|
232
202
|
# @param [Array<String|HBase::ColumnKey>] columns Array of "FAMILY:QUALIFIER" expressions and ColumnKey objects.
|
233
203
|
# @return [Array<BigDecimal>]
|
@@ -240,7 +210,7 @@ class Result
|
|
240
210
|
# @param [String, HBase::ColumnKey] column "FAMILY:QUALIFIER" expression or ColumnKey object.
|
241
211
|
# @return [Hash<Fixnum, BigDecimal>]
|
242
212
|
# @overload bigdecimals(columns)
|
243
|
-
# For each column specified,
|
213
|
+
# For each column specified,
|
244
214
|
# returns all versions of column values as BigDecimals in a Hash indexed by their timestamps
|
245
215
|
# @param [Array<String|HBase::ColumnKey>] columns Array of "FAMILY:QUALIFIER" expressions and ColumnKey objects.
|
246
216
|
# @return [Array<Hash<Fixnum, BigDecimal>>]
|
@@ -253,7 +223,7 @@ class Result
|
|
253
223
|
# @param [String, HBase::ColumnKey] column "FAMILY:QUALIFIER" expression or ColumnKey object.
|
254
224
|
# @return [Float]
|
255
225
|
# @overload float(columns)
|
256
|
-
# For each column specified,
|
226
|
+
# For each column specified,
|
257
227
|
# returns the latest column values as a Float
|
258
228
|
# @param [Array<String|HBase::ColumnKey>] columns Array of "FAMILY:QUALIFIER" expressions and ColumnKey objects.
|
259
229
|
# @return [Array<Float>]
|
@@ -267,7 +237,7 @@ class Result
|
|
267
237
|
# @param [String, HBase::ColumnKey] column "FAMILY:QUALIFIER" expression or ColumnKey object.
|
268
238
|
# @return [Hash<Fixnum, Float>]
|
269
239
|
# @overload floats(columns)
|
270
|
-
# For each column specified,
|
240
|
+
# For each column specified,
|
271
241
|
# returns all versions of column values as Floats in a Hash indexed by their timestamps
|
272
242
|
# @param [Array<String|HBase::ColumnKey>] columns Array of "FAMILY:QUALIFIER" expressions and ColumnKey objects.
|
273
243
|
# @return [Array<Hash<Fixnum, Float>>]
|
@@ -281,7 +251,7 @@ class Result
|
|
281
251
|
# @param [String, HBase::ColumnKey] column "FAMILY:QUALIFIER" expression or ColumnKey object.
|
282
252
|
# @return [true, false]
|
283
253
|
# @overload boolean(columns)
|
284
|
-
# For each column specified,
|
254
|
+
# For each column specified,
|
285
255
|
# returns the latest column values as a boolean value
|
286
256
|
# @param [Array<String|HBase::ColumnKey>] columns Array of "FAMILY:QUALIFIER" expressions and ColumnKey objects.
|
287
257
|
# @return [Array<true|false>]
|
@@ -295,7 +265,7 @@ class Result
|
|
295
265
|
# @param [String, HBase::ColumnKey] column "FAMILY:QUALIFIER" expression or ColumnKey object.
|
296
266
|
# @return [Hash<Fixnum, true|false>]
|
297
267
|
# @overload booleans(columns)
|
298
|
-
# For each column specified,
|
268
|
+
# For each column specified,
|
299
269
|
# returns all versions of column values as boolean values in a Hash indexed by their timestamps
|
300
270
|
# @param [Array<String|HBase::ColumnKey>] columns Array of "FAMILY:QUALIFIER" expressions and ColumnKey objects.
|
301
271
|
# @return [Array<Hash<Fixnum, true|false>>]
|
@@ -304,6 +274,10 @@ class Result
|
|
304
274
|
end
|
305
275
|
alias bools booleans
|
306
276
|
|
277
|
+
def <=> other
|
278
|
+
Bytes.compareTo(rowkey(:raw), other.rowkey(:raw))
|
279
|
+
end
|
280
|
+
|
307
281
|
private
|
308
282
|
HASH_TEMPLATE = {}.tap { |h|
|
309
283
|
h.instance_eval do
|
@@ -326,7 +300,9 @@ private
|
|
326
300
|
cols.map { |col|
|
327
301
|
cf, cq = Util.parse_column_name(col)
|
328
302
|
if with_versions
|
329
|
-
|
303
|
+
# Need to make it a Ruby hash:
|
304
|
+
# Prevents implicit conversion from ruby type to java type when updating the Hash
|
305
|
+
Hash[ allmap.fetch(cf, {}).fetch(cq, {}) ]
|
330
306
|
else
|
331
307
|
@result.getValue cf, cq
|
332
308
|
end
|
@@ -365,7 +341,7 @@ private
|
|
365
341
|
def parse_schema schema
|
366
342
|
{}.tap { |ret|
|
367
343
|
schema.each do |name, type|
|
368
|
-
ck =
|
344
|
+
ck =
|
369
345
|
case name
|
370
346
|
when ColumnKey
|
371
347
|
name
|
@@ -378,5 +354,5 @@ private
|
|
378
354
|
}
|
379
355
|
end
|
380
356
|
end#Result
|
381
|
-
end#HBase
|
357
|
+
end#HBase
|
382
358
|
|
@@ -0,0 +1,47 @@
|
|
1
|
+
class HBase
|
2
|
+
class Scoped
|
3
|
+
# Basic data aggregation with coprocessor based on AggregateImplementation
|
4
|
+
# @author Junegunn Choi <junegunn.c@gmail.com>
|
5
|
+
module Aggregation
|
6
|
+
module Admin
|
7
|
+
# Enables aggregation support for the table
|
8
|
+
# @return [nil]
|
9
|
+
def enable_aggregation!
|
10
|
+
add_coprocessor! 'org.apache.hadoop.hbase.coprocessor.AggregateImplementation'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# Performs aggregation with coprocessor
|
15
|
+
# @param [Symbol] op Aggregation type: :sum, :min, :max, :avg, :std, :row_count
|
16
|
+
# @param [Symbol, org.apache.hadoop.hbase.coprocessor.ColumnInterpreter] type
|
17
|
+
# Column type (only :fixnum is supported as of now) or ColumnInterpreter object used to decode the value
|
18
|
+
def aggregate op, type = :fixnum
|
19
|
+
aggregation_impl op, type
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
def aggregation_impl method, type
|
24
|
+
raise ArgumentError.new("No column specified") if method != :row_count && @project.empty?
|
25
|
+
|
26
|
+
@aggregation_client ||= AggregationClient.new(table.config)
|
27
|
+
@aggregation_client.send(
|
28
|
+
method,
|
29
|
+
Util.to_bytes(table.name),
|
30
|
+
column_interpreter_for(type),
|
31
|
+
filtered_scan)
|
32
|
+
end
|
33
|
+
|
34
|
+
def column_interpreter_for type
|
35
|
+
case type
|
36
|
+
when :fixnum, :int, :integer
|
37
|
+
LongColumnInterpreter.new
|
38
|
+
when org.apache.hadoop.hbase.coprocessor.ColumnInterpreter
|
39
|
+
type
|
40
|
+
else
|
41
|
+
raise ArgumentError, "Column interpreter for #{type} not implemented."
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end#Aggregation
|
45
|
+
end#Scoped
|
46
|
+
end#HBase
|
47
|
+
|