Python転職初心者向けエンジニアリングブログ

Pythonに魅了されたあなたへ。エンジニアリングの扉を開く転職初心者向けのブログへようこそ。このブログでは、Pythonの奥深さに迫りながら、エンジニアリングへの転職に役立つ情報を提供しています。未経験者から始めるPythonエンジニアリングの世界への一歩を踏み出すためのガイダンス、ベストプラクティス、そして成功事例など、初心者の方でもわかりやすいコンテンツをお届けします。

ScalaとPythonの連携について徹底解説

LYPプレミアム会員 python

ScalaとPythonの連携について徹底解説

ScalaとPython、それぞれが持つ強力な機能と柔軟性を活かして、これら2つのプログラミング言語を連携させることで、システムやアプリケーション開発において大きなメリットが得られます。ScalaはJVM(Java仮想マシン)上で動作し、関数型とオブジェクト指向を融合した強力な言語で、特に分散処理や大規模データ処理(Sparkなど)で使われることが多いです。一方、Pythonはそのシンプルさと豊富なライブラリ群から、機械学習やデータサイエンスの分野で広く活用されています。

本記事では、ScalaとPythonを連携させる方法について、初心者向けにわかりやすく説明し、具体的なサンプルコードを用いて解説します。

ScalaとPythonの連携アプローチ

ScalaとPythonを連携させる代表的な方法としては、以下のようなものがあります。

  1. ScalaからPythonスクリプトを実行する
  2. PythonからScalaコードを呼び出す
  3. ScalaとPython間でHTTP通信を行う
  4. 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-httpsttpなどのライブラリを使って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を利用した大規模データ処理まで、さまざまな方法があります。