はじめに
DatabricksのイベントData & AI Summitで非常に興味深いソリューションが発表されました。
その名もEnglish SDK for Apache Spark.
まだ開発の初期段階とのことですが、すでにGitにも公開されており、試すことができます。
早速、Databricks上で使ってみました。
ノートブック
こちらにノートブックを公開しますので、Databricks環境にインポートしてお試しください。
サンプルノートブック
設定
pyspark-aiをインストールします。
%pip install pyspark-ai
LLMを指定します。OPEN AIを利用する場合、Secret Keyを取得し環境変数のOPENAI_API_KEYを設定する必要があります。(OpenSource版はまた今度試してみます)
LLMの指定をしない場合、デフォルトでChatGPT-4を利用しようとするので、まだ利用できない場合は以下のように3.5を指定します。
Databricksをお使いの場合は、DatabricksのSecret機能を利用して、Secret Keyを保護してください。
import os
os.environ["OPENAI_API_KEY"] = dbutils.secrets.get("<scope>", "<key>")
from pyspark_ai import SparkAI
import openai
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model_name="gpt-3.5-turbo",temperature=0, verbose=True)
spark_ai = SparkAI(llm=llm)
spark_ai.activate() # active partial functions for Spark DataFrame
利用開始
それでは早速使ってみます。
やり方はちょっと違うかもしれませんが、UnityCatalogからデータを読み込み、spark_aiのDataframeに取り込みます。
taxi = spark.read.table("samples.nyctaxi.trips")
taxi_df = spark_ai.transform_df(taxi, "get all data")
display(taxi_df)
可視化
ChatGPTなので、日本語でも指令できます。
UDFの作成
運賃を距離で割るUDFを作成。その際距離が0の場合。”-1”と表示するように、自然言語で指令
from pyspark.sql.functions import *
@spark_ai.udf
def fare_per_distance(amount: int, distance: int) -> int:
"""Calculate fare amount per distance. distanceが0の場合は"-1"とする"""
spark.udf.register("fare_per_distance", fare_per_distance)
taxi_df.createOrReplaceTempView("taxiDF")
rate_df = spark.sql("select fare_amount, trip_distance, fare_per_distance(fare_amount, trip_distance) as fare_distance from taxiDF")
display(rate_df)
Dataframeの説明を求める
rate_df.ai.explain()
URLからデータを取得(スクレイピング)
参照先URL:https://www.carpro.com/blog/full-year-2022-national-auto-sales-by-brand
auto_df = spark_ai.create_df("https://www.carpro.com/blog/full-year-2022-national-auto-sales-by-brand")
display(auto_df)
データ変換・探索
auto_top_growth_df=auto_df.ai.transform("急成長しているブランドは?")
display(auto_top_growth_df)
さいごに
こちらEnglish SDKという名前でしたが、日本語でも利用することが出来て、非常にパワフルなツールになりそうということが分かりました。まだまだ開発を進めているようなので是非開発プロジェクトに入ってフィードバックをしてください。
しかし、自然言語とデータ分析って相性いいですね。