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
重い…。
まあ、とりあえず目的は達成できたので、いいかなぁ…。