Data & AIのサミットで発表された新機能：DatabricksのEnglish SDK for Apache Sparkを試してみた


# はじめに

DatabricksのイベントData & AI Summitで非常に興味深いソリューションが発表されました。
その名も**English SDK for Apache Spark**.  

https://www.databricks.com/jp/blog/introducing-english-new-programming-language-apache-spark

まだ開発の初期段階とのことですが、すでにGitにも公開されており、試すことができます。

https://github.com/databrickslabs/pyspark-ai/


早速、Databricks上で使ってみました。

# ノートブック

こちらにノートブックを公開しますので、Databricks環境にインポートしてお試しください。
[サンプルノートブック](https://sajpstorage.blob.core.windows.net/maruyama/qiita/pyspark-ai-databricks-test.html)

# 設定

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を保護してください。

```:OPENAI_API_KEYの設定
import os
os.environ["OPENAI_API_KEY"] = dbutils.secrets.get("<scope>", "<key>")
```

```:LLMの設定
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に取り込みます。

```python
taxi = spark.read.table("samples.nyctaxi.trips")
taxi_df = spark_ai.transform_df(taxi, "get all data")
display(taxi_df)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/45b4bf93-7905-d7d3-dc54-a58b53fe8d75.png)


### 可視化

ChatGPTなので、日本語でも指令できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/f334f729-4fd1-b388-f0cc-c23eb6810136.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/efae8081-902a-e837-d568-19cd3748ad82.png)

### UDFの作成

運賃を距離で割るUDFを作成。その際距離が0の場合。”-1”と表示するように、自然言語で指令

```python
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) 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/43d8ed65-2601-eba0-da00-2a72895b6a95.png)

### Dataframeの説明を求める

```python
rate_df.ai.explain()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/eadc1e1e-93a1-5a9f-788b-9d7022dbffbd.png)

### URLからデータを取得（スクレイピング）
参照先URL：https://www.carpro.com/blog/full-year-2022-national-auto-sales-by-brand

```python
auto_df = spark_ai.create_df("https://www.carpro.com/blog/full-year-2022-national-auto-sales-by-brand")
display(auto_df)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/5a32898f-2e1b-97b4-1469-f28fb1bc0b6f.png)


### データ変換・探索

```python
auto_top_growth_df=auto_df.ai.transform("急成長しているブランドは？")
display(auto_top_growth_df)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/8535da33-90c0-5066-fd8b-2a2e827f1a72.png)


# さいごに

こちらEnglish SDKという名前でしたが、日本語でも利用することが出来て、非常にパワフルなツールになりそうということが分かりました。まだまだ開発を進めているようなので是非開発プロジェクトに入ってフィードバックをしてください。

しかし、自然言語とデータ分析って相性いいですね。