CLOVER🍀

That was when it all began.

Apache Groovy+Grapesで、Apache Sparkを動かす

Apache Sparkを、Apache Groovy+Grapesを使って、スクリプトで動かしてみようかなと。

いや、ローカル動作でいいので、少しお手軽にApache Sparkを使う方法が欲しくてですね…。

サンプルとしては、こちらのドキュメントを見ながらGroovyスクリプトにしていこうと思います。

Spark SQL, DataFrames and Datasets Guide / Data Sources

CSVファイルを読んでみる例ですね。

ドキュメントと同じく、CSVファイルはexampleのものを使用してみます。

$ wget https://raw.githubusercontent.com/apache/spark/master/examples/src/main/resources/people.csv

こんなやつですね。
people.csv

name;age;job
Jorge;30;Developer
Bob;32;Developer

動作環境は、このように。

$ groovy -version
Groovy Version: 2.5.0 JVM: 1.8.0_171 Vendor: Oracle Corporation OS: Linux

利用するApache Sparkのバージョンは、2.3.0です。

作成したスクリプトは、こちら。
spark.groovy

@Grab('javax.xml.bind:jaxb-api:2.2.2')
@Grab('org.apache.spark:spark-sql_2.11:2.3.0')
@GrabExclude('javax.xml.bind:jaxb-api')
import org.apache.spark.sql.SparkSession

def csvFile = args[0]
def tableName = args[1]

def spark = SparkSession.builder().master('local').appName('script').getOrCreate()

def peopleDFCsv = spark.read().format("csv")
    .option("sep", ";")
    .option("inferSchema", "true")
    .option("header", "true")
    .load(csvFile)

peopleDFCsv.show()

peopleDFCsv.createOrReplaceTempView(tableName)

spark.sql("SELECT SUM(age) FROM ${tableName}").show()

spark.stop()

うちの環境では、JAXB RIの依存関係をどうにかしないと、Grapesがうまく動いてくれませんでした…。

あと、起動引数(ファイル名とテーブル名)を受け取るようにしておきました。

実行。

$ groovy spark.groovy people.csv people
+-----+---+---------+
| name|age|      job|
+-----+---+---------+
|Jorge| 30|Developer|
|  Bob| 32|Developer|
+-----+---+---------+

+--------+
|sum(age)|
+--------+
|      62|
+--------+

動くには、動きました。ちょっと時間がかかりましたけど…。

$ time groovy spark.groovy people.csv people
+-----+---+---------+
| name|age|      job|
+-----+---+---------+
|Jorge| 30|Developer|
|  Bob| 32|Developer|
+-----+---+---------+

+--------+
|sum(age)|
+--------+
|      62|
+--------+


real	0m18.151s
user	0m51.252s
sys	0m8.024s

重い…。

まあ、とりあえず目的は達成できたので、いいかなぁ…。