Thank you guys for this great discussion. I got my first Jruby-script running in the HBase shell. It scans a directory and loads each file of a given type into a Table :-)
2014-10-05 1:43 GMT+02:00 Ted Yu <[email protected]>: > Take a look at Bytes.readByteArray(): > > public static byte [] readByteArray(final DataInput in) > > ... > > byte [] result = new byte[len]; > > in.readFully(result, 0, len); > > In your case, you have 'buffer' so you don't need to allocate 'result'. > > Just plug buffer in the call to readFully(). > > Cheers > > On Sat, Oct 4, 2014 at 4:37 PM, Roger Maillist <[email protected]> > wrote: > > > I still don't see how they would read into a byte[] buffer. This method > > seems to read an integer value, which is simple. The read(byte[]) method > > returns the number of bytes read and copies the stream into the > > out-parameter. That's unclear to me for JRuby... > > > > 2014-10-05 0:29 GMT+02:00 Ted Yu <[email protected]>: > > > > > Take a look at readFile() method in bin/region_mover.rb > > > > > > Cheers > > > > > > On Sat, Oct 4, 2014 at 2:33 PM, Roger Maillist < > > [email protected]> > > > wrote: > > > > > > > Well, I see they are using .to_java_bytes to cast a string and pass > it > > to > > > > the put-method, that's ok. But I am having trouble calling > > > > the inputStream.read method. > > > > > > > > I tried this: > > > > > > > > inFile = File.new("/home/roger/Downloads/test.jpg") > > > > inputStream = FileInputStream.new(inFile) > > > > > > > > length = inFile.length() > > > > buffer = "" > > > > > > > > inputStream.read(buffer) > > > > > > > > But that won't work. It's probably more of a JRuby question than > > actually > > > > an HBase issue... > > > > > > > > 2014-10-04 23:22 GMT+02:00 Ted Yu <[email protected]>: > > > > > > > > > Take a look at _put_internal() method of > > > > > hbase-shell//src/main/ruby/hbase/table.rb > > > > > > > > > > On Sat, Oct 4, 2014 at 2:15 PM, Roger Maillist < > > > > [email protected]> > > > > > wrote: > > > > > > > > > > > Hi out there > > > > > > > > > > > > I am trying to read a (binary) file from the local FS and store > it > > in > > > > > HBase > > > > > > using JRuby. > > > > > > > > > > > > But I fail with the byte-array InputStream needed for the > > Put-Method: > > > > > > > > > > > > require "java" > > > > > > > > > > > > java_import "java.io.File" > > > > > > java_import "java.io.FileInputStream" > > > > > > > > > > > > java_import "org.apache.hadoop.hbase.client.HTable" > > > > > > java_import "org.apache.hadoop.hbase.client.Put" > > > > > > > > > > > > def jbytes(*args) > > > > > > args.map { |arg| arg.to_s.to_java_bytes } > > > > > > end > > > > > > > > > > > > puts "Hello from Ruby" > > > > > > > > > > > > inFile = File.new("/home/roger/Downloads/test.jpg") > > > > > > inputStream = FileInputStream.new(inFile) > > > > > > > > > > > > length = inFile.length() > > > > > > buffer = Java::byte[length].new > > > > > > > > > > > > inputStream.read(buffer) > > > > > > > > > > > > table = HTable.new(@hbase.configuration, "emails") > > > > > > p = Put.new(*jbytes("roger3.pdf")) > > > > > > > > > > > > p.add(*jbytes("inhalt", "", buffer)) > > > > > > > > > > > > table.put(p) > > > > > > > > > > > > inputStream.close() > > > > > > table.close() > > > > > > > > > > > > > > > > > > > > > > > > Has anyone done this right? > > > > > > > > > > > > I tried and googled....no breakthrough :-/ > > > > > > > > > > > > Thanks > > > > > > Roger > > > > > > > > > > > > > > > > > > > > >
