最近失业在家,搞点好玩的,于是看看能不能给apache spark做个ruby的api, 毕竟python都有了,ruby应该也能做,何况还有JRuby.
因为用spark-sql比较多,就先试试spark-sql这个模块
一开始想走捷径,直接在jruby里面java_import Spark的类,发现不行,报错。
还是先研究了一下python api是怎么做的:
看了几天代码,发现是用py4j这个模块做的,仔细研究了一下,发现是用p4yj的javagatewayServer在Java这边开了个server,然后python
那边通过socket 来传递消息,这样暴露了一些spark的内部类和对象给python这边调用。
于是打算实现一下 py4j的机制,只要我用ruby 给 py4j的GatewayServer发消息就好啦。
然而还是懒
于是刚才去面试完回来想着没准我自己实现一个java 类,把 spark的方法包起来就能调用了,于是赶紧实验了下:
这是java的类
importorg.apache.spark.sql.DataFrameReader;
importorg.apache.spark.sql.SparkSession;
public classProof {
publicSparkSession Initial(String[] args) {
SparkSession spark = SparkSession.builder().master("local[*]").getOrCreate();
returnspark;
}
publicDataFrameReader reader(SparkSession spark) {
DataFrameReader reader = spark.read();
returnreader;
};
;
}
这是ruby 调用的代码
```ruby
require 'java'
require './jruby_spark_bridge_jar/jruby-spark-bridge.jar'
java_import 'Proof'
a = Proof.new
puts spark = a.Initial([])
puts spark.methods.sort
df = spark.sql("select 1")
```
好像这样就暴露出来sparksession上的一些方法,我试了下是可以读取一个csv文件返回一个dataset对象的。
貌似这样就可以在jruby里面写spark了
啥,你问我有啥实际意义?
并没有,只是为了好玩