ScalaとPythonの連携について徹底解説
ScalaとPython、それぞれが持つ強力な機能と柔軟性を活かして、これら2つのプログラミング言語を連携させることで、システムやアプリケーション開発において大きなメリットが得られます。ScalaはJVM(Java仮想マシン)上で動作し、関数型とオブジェクト指向を融合した強力な言語で、特に分散処理や大規模データ処理(Sparkなど)で使われることが多いです。一方、Pythonはそのシンプルさと豊富なライブラリ群から、機械学習やデータサイエンスの分野で広く活用されています。
本記事では、ScalaとPythonを連携させる方法について、初心者向けにわかりやすく説明し、具体的なサンプルコードを用いて解説します。
ScalaとPythonの連携アプローチ
ScalaとPythonを連携させる代表的な方法としては、以下のようなものがあります。
- ScalaからPythonスクリプトを実行する
- PythonからScalaコードを呼び出す
- ScalaとPython間でHTTP通信を行う
- PySparkを利用した連携
ScalaからPythonスクリプトを実行する方法
まず最も簡単な方法として、ScalaからPythonスクリプトを外部プログラムとして実行する方法を紹介します。これは、ScalaのProcess
クラスを使ってPythonのスクリプトを呼び出し、その結果を取得するというものです。
次のコードは、ScalaからPythonスクリプトを実行する例です。
import scala.sys.process._ val command = "python3 hello.py" val output = command.!! println(s"Python script output: $output")
このコードは、Scalaの標準ライブラリを使って外部コマンドとしてhello.py
というPythonスクリプトを実行し、その出力を取得しています。実行するPythonスクリプトhello.py
は以下のように定義されています。
# hello.py print("Hello from Python!")
このScalaコードを実行すると、次のような結果が得られます。
Python script output: Hello from Python!
この方法を使えば、ScalaのアプリケーションからPythonスクリプトを実行して、必要な処理をPython側で行い、その結果をScalaに戻すことができます。
PythonからScalaコードを呼び出す方法
次に、PythonからScalaコードを実行する方法を見てみましょう。ScalaはJVM上で動作するため、PythonからScalaのプログラムを実行するためには、まずScalaのコードをコンパイルして実行可能なJARファイルを作成します。その後、Pythonのsubprocess
モジュールを使ってこのJARファイルを呼び出します。
まず、以下のようなシンプルなScalaプログラムを用意します。
object HelloScala { def main(args: Array[String]): Unit = { println("Hello from Scala!") } }
このプログラムをコンパイルしてJARファイルにします。
scalac HelloScala.scala jar -cvf HelloScala.jar HelloScala*.class
次に、PythonからこのJARファイルを実行します。
import subprocess # ScalaのJARファイルを実行 result = subprocess.run(["java", "-cp", "HelloScala.jar", "HelloScala"], capture_output=True, text=True) # Scalaプログラムの出力を表示 print("Output from Scala program:", result.stdout)
Pythonのコードを実行すると、次のような結果が得られます。
Output from Scala program: Hello from Scala!
この方法では、PythonからScalaのプログラムを簡単に呼び出すことができます。PythonからScalaの高度な処理やJVMベースのライブラリを活用したい場合に便利です。
HTTP通信を用いたScalaとPythonの連携
次に、HTTP通信を利用してScalaとPythonを連携させる方法を紹介します。この方法は、両方の言語でWebサーバーやクライアントとしての役割を持たせ、HTTPリクエストを介してデータをやり取りするというものです。
PythonでFlaskを使ったHTTPサーバー
まず、Python側でFlaskを使ってHTTPサーバーを作成します。Flaskは軽量なWebフレームワークで、短いコードで簡単にサーバーを立てることができます。
from flask import Flask, jsonify app = Flask(__name__) @app.route('/api/hello', methods=['GET']) def hello(): return jsonify(message="Hello from Python!") if __name__ == '__main__': app.run(debug=True, port=5000)
このコードは、/api/hello
エンドポイントにGETリクエストが来た際に"Hello from Python!"
というメッセージを返すシンプルなHTTPサーバーです。
ScalaでHTTPクライアント
次に、ScalaでこのPythonサーバーにリクエストを送るHTTPクライアントを実装します。Scalaでは、akka-http
やsttp
などのライブラリを使ってHTTP通信を行うことができますが、ここではsttp
を使った例を紹介します。
まず、build.sbt
ファイルにsttp
ライブラリを追加します。
libraryDependencies += "com.softwaremill.sttp.client3" %% "core" % "3.3.13"
次に、Scalaのコードを実装します。
import sttp.client3._ object ScalaClient extends App { val backend = HttpURLConnectionBackend() val request = basicRequest.get(uri"http://localhost:5000/api/hello") val response = request.send(backend) println(s"Response from Python server: ${response.body}") }
このScalaコードは、PythonサーバーにGETリクエストを送り、返ってきたレスポンスを表示します。
実行結果は次のようになります。
Response from Python server: Right({"message":"Hello from Python!"})
この方法では、HTTPを使って異なる言語間での通信が可能になります。APIを活用することで、システムの柔軟性が大幅に向上します。
PySparkを利用したScalaとPythonの連携
もう1つの連携方法として、Apache Sparkを活用することが挙げられます。Sparkは、Scalaをベースにした大規模データ処理フレームワークで、Pythonからも利用できるPySpark
というAPIを提供しています。これを使うと、Scalaの強力なデータ処理能力をPythonから活用することができます。
まず、PySparkをインストールします。
pip install pyspark
次に、PySparkを使ったPythonのコード例を紹介します。
from pyspark.sql import SparkSession # Sparkセッションを作成 spark = SparkSession.builder.appName("Python to Scala Spark").getOrCreate() # サンプルデータを作成 data = [("Alice", 34), ("Bob", 45), ("Catherine", 29)] columns = ["Name", "Age"] # データフレームを作成 df = spark.createDataFrame(data, columns) # データフレームの内容を表示 df.show() # 統計情報を取得 df.describe().show()
このコードは、PySparkを使ってデータフレームを作成し、簡単な統計情報を取得する例です。ScalaとPythonの両方でSparkを活用できるため、大規模なデータ処理を行う際に非常に有用です。
まとめ
ScalaとPythonの連携は、分散処理や大規模データ処理、さらにはアプリケーション開発において強力なツールとなります。Process
を使った外部スクリプトの実行から、HTTP通信を利用したデータのやり取り、PySparkを利用した大規模データ処理まで、さまざまな方法があります。