class Spark::JavaBridge::Base

Constants

JAVA_OBJECTS
JAVA_TEST_OBJECTS
RUBY_TO_JAVA_SKIP

Public Class Methods

new(target) click to toggle source
# File lib/spark/java_bridge/base.rb, line 44
def initialize(target)
  @target = target
end

Public Instance Methods

call(klass, method, *args) click to toggle source

Call java object

# File lib/spark/java_bridge/base.rb, line 73
def call(klass, method, *args)
  # To java
  args.map!{|item| to_java(item)}

  # Call java
  result = klass.__send__(method, *args)

  # To ruby
  to_ruby(result)
end
import_all() click to toggle source

Import all important classes into Objects

# File lib/spark/java_bridge/base.rb, line 49
def import_all
  return if @imported

  java_objects.each do |name, klass|
    import(name, klass)
  end

  @imported = true
  nil
end
import_all_test() click to toggle source

Import classes for testing

# File lib/spark/java_bridge/base.rb, line 61
def import_all_test
  return if @imported_test

  java_test_objects.each do |name, klass|
    import(name, klass)
  end

  @imported_test = true
  nil
end
java_to_ruby(object)
Alias for: to_ruby
ruby_to_java(object)
Alias for: to_java
to_java(object) click to toggle source
# File lib/spark/java_bridge/base.rb, line 97
def to_java(object)
  if RUBY_TO_JAVA_SKIP.include?(object.class)
    # Some object are convert automatically
    # This is for preventing errors
    # For example: jruby store integer as long so 1.to_java is Long
    object
  elsif object.respond_to?(:to_java)
    object.to_java
  elsif object.is_a?(Array)
    to_java_array_list(object)
  else
    object
  end
end
Also aliased as: ruby_to_java
to_java_array_list(array) click to toggle source
# File lib/spark/java_bridge/base.rb, line 84
def to_java_array_list(array)
  array_list = ArrayList.new
  array.each do |item|
    array_list.add(to_java(item))
  end
  array_list
end
to_long(number) click to toggle source
# File lib/spark/java_bridge/base.rb, line 92
def to_long(number)
  return nil if number.nil?
  JLong.new(number)
end
to_ruby(object) click to toggle source

Array problem:

Rjb:   object.toArray -> Array
Jruby: object.toArray -> java.lang.Object
# File lib/spark/java_bridge/base.rb, line 116
def to_ruby(object)
  if java_object?(object)
    class_name = object.getClass.getSimpleName
    case class_name
    when 'ArraySeq'
      result = []
      iterator = object.iterator
      while iterator.hasNext
        result << to_ruby(iterator.next)
      end
      result
    when 'Map2', 'Map3', 'Map4', 'HashTrieMap'
      Hash[
        object.toSeq.array.to_a.map!{|item| [item._1, item._2]}
      ]
    when 'SeqWrapper'; object.toArray.to_a.map!{|item| to_ruby(item)}
    when 'ofRef';      object.array.to_a.map!{|item| to_ruby(item)} # WrappedArray$ofRef
    when 'LabeledPoint'; Spark::Mllib::LabeledPoint.from_java(object)
    when 'DenseVector';  Spark::Mllib::DenseVector.from_java(object)
    when 'KMeansModel';  Spark::Mllib::KMeansModel.from_java(object)
    when 'DenseMatrix';  Spark::Mllib::DenseMatrix.from_java(object)
    else
      # Some RDD
      if class_name != 'JavaRDD' && class_name.end_with?('RDD')
        object = object.toJavaRDD
        class_name = 'JavaRDD'
      end

      # JavaRDD
      if class_name == 'JavaRDD'
        jrdd = RubyRDD.toRuby(object)

        serializer = Spark::Serializer.build { __batched__(__marshal__) }
        serializer = Spark::Serializer.build { __batched__(__marshal__, 2) }

        return Spark::RDD.new(jrdd, Spark.sc, serializer, deserializer)
      end

      # Unknow
      Spark.logger.warn("Java object '#{object.getClass.name}' was not converted.")
      object
    end

  else
    # Already transfered
    object
  end
end
Also aliased as: java_to_ruby

Private Instance Methods

jars() click to toggle source
# File lib/spark/java_bridge/base.rb, line 170
def jars
  result = Dir.glob(File.join(@target, '*.jar'))
  result.flatten!
  result
end
java_objects() click to toggle source
# File lib/spark/java_bridge/base.rb, line 189
def java_objects
  objects_with_names(JAVA_OBJECTS)
end
java_test_objects() click to toggle source
# File lib/spark/java_bridge/base.rb, line 193
def java_test_objects
  objects_with_names(JAVA_TEST_OBJECTS)
end
objects_with_names(objects) click to toggle source
# File lib/spark/java_bridge/base.rb, line 176
def objects_with_names(objects)
  hash = {}
  objects.each do |object|
    if object.is_a?(Hash)
      hash.merge!(object)
    else
      key = object.split('.').last.to_sym
      hash[key] = object
    end
  end
  hash
end
raise_missing_class(klass) click to toggle source
# File lib/spark/java_bridge/base.rb, line 197
def raise_missing_class(klass)
  raise Spark::JavaBridgeError, "Class #{klass} is missing. Make sure that Spark and RubySpark is assembled."
end