PySparkでのネイティブプロットのサポート

これは見逃していました。

https://www.databricks.com/jp/blog/pyspark-native-plotting

これまでは、`display`を使うか、Pandas on Sparkかpandasデータフレームに変換してプロットしていたので、この機能は嬉しいです。[リリースノート](https://docs.databricks.com/aws/en/release-notes/runtime/17.0#highlights)にも記載されていました。

![Screenshot 2025-06-21 at 12.04.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c904adde-8818-4b73-9aaf-f36ea614b6eb.png)


# PySparkネイティブプロッティングとは

Databricks Runtime 17.0で導入されたPySpark Native Plottingは、PySparkデータフレームから直接グラフを作成できる機能です。これまでPandasへの変換やサードパーティツールが必要だった可視化作業が、PySparkの中で完結できるようになりました。この機能は、大規模データの効率的なサンプリングと集計を自動的に行い、Plotlyを使用してインタラクティブな可視化を提供します。

## 機能概要

PySpark Native Plottingは、PySparkデータフレームに`.plot`プロパティを追加し、様々な種類のグラフを直接作成できる機能です。

### 主な特徴

| 特徴 | 説明 |
|------|------|
| **統合されたAPI** | PySparkデータフレームから直接プロット可能 |
| **自動最適化** | 大規模データを自動的にサンプリング・集計 |
| **豊富な可視化タイプ** | 折れ線、棒、散布図、ヒストグラムなど多様なグラフに対応 |
| **インタラクティブ性** | Plotlyベースの対話的な可視化 |
| **パフォーマンス** | SQLレベルの最適化により高速処理を実現 |

### サポートされているグラフタイプ

```
基本的なグラフタイプ：
├── line（折れ線グラフ）
├── bar（棒グラフ）
├── barh（横棒グラフ）
├── area（面グラフ）
├── scatter（散布図）
├── pie（円グラフ）
├── box（箱ひげ図）
├── hist（ヒストグラム）
└── kde（カーネル密度推定）
```

### データ処理フロー図

```
PySparkデータフレーム
    ↓
[自動サンプリング/集計]
    ↓
[SQL最適化エンジン]
    ↓
[Plotly可視化エンジン]
    ↓
インタラクティブグラフ
```

## メリット、嬉しさ

### 1. ワークフローの簡素化

**従来の方法（複雑）:**
```python
# PySparkデータをPandasに変換してからプロット
pandas_df = spark_df.toPandas()
pandas_df.plot(kind='bar')
```

**新しい方法（シンプル）:**
```python
# PySparkデータフレームから直接プロット
spark_df.plot.bar()
```

### 2. パフォーマンスの向上

| 比較項目 | 従来の方法 | PySpark Native Plotting |
|---------|-----------|-------------------------|
| データ転送 | 全データをドライバーに収集 | 必要な集計結果のみ転送 |
| メモリ使用量 | 大規模データでOOMリスク | 効率的なサンプリング |
| 処理速度 | データ量に比例して遅延 | 分散処理で高速 |

### 3. 統一されたエクスペリエンス

```
開発者の利点：
├── 学習コストの削減（Pandas APIと同じインターフェース）
├── コードの一貫性向上
├── エラーの削減（型変換不要）
└── デバッグの容易さ
```

# ウォークスルー

DBR 17.0のクラスターを使います

![Screenshot 2025-06-21 at 12.04.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4658d103-fb01-4730-8146-d4735cf9e8b2.png)

元のブログ記事に沿ってデータフレームを作成します。アシスタントに頼んだらコード作ってkれました。

![Screenshot 2025-06-21 at 12.07.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5be6e8f7-b483-4e7e-81e1-84b12958fc5b.png)


```py
# サンプルデータの作成
data = [
    ("電子機器", 20000, 5000, 25.0),
    ("家具", 15000, 2000, 13.33),
    ("オフィス用品", 12000, 3000, 25.0),
    ("衣類", 8000, 1000, 12.5),
    ("食品", 10000, 2500, 25.0),
    ("書籍", 6000, 1500, 25.0),
    ("スポーツ", 7000, 2000, 28.57),
    ("おもちゃ", 5000, 500, 10.0)
]

# スキーマの定義
columns = ["カテゴリー", "売上", "利益", "利益率"]

# DataFrameの作成
df = spark.createDataFrame(data, columns)

# DataFrameの表示
display(df)
```
![Screenshot 2025-06-21 at 12.07.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/313f8c25-9eae-4c9c-9fb3-f7384c06d62f.png)

散布図をプロットします。

```py
fig = df.plot.scatter(x="売上",
    y="利益",
    size="利益率",
    text="カテゴリー",
    hover_name="カテゴリー",
    color="利益率",  # 利益率に基づくカラースケールを追加
    color_continuous_scale="Plasma",  # 視覚的に魅力的なカラースケールを使用
)
fig
```

おおー。日本語の列名でも動きます。
![Screenshot 2025-06-21 at 12.09.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0b75061b-3312-47c4-a38d-56a5583a677b.png)

棒グラフ。

```py
# 売上高と利益を同時に表示
df.plot.bar(x="カテゴリー", y=["売上", "利益"])
```
![newplot (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f9b372d9-575c-4950-ba84-ca73bf71bbab.png)


折れ線グラフも。

```py
import datetime

# サンプルのPySpark DataFrameを作成
data = [
    (datetime.date(2025, 1, 1), 10),
    (datetime.date(2025, 1, 2), 12),
    (datetime.date(2025, 1, 3), 15),
    (datetime.date(2025, 1, 4), 13),
    (datetime.date(2025, 1, 5), 18)
]
df = spark.createDataFrame(data, ["date", "value"])

# .plotアクセサを使用して折れ線グラフを作成
df.plot.line(x="date", y="value", title="時系列データ")
```
![newplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/25bac26f-9beb-4b3d-91d0-927075d9a3ec.png)

# まとめ

PySpark Native Plottingは、ビッグデータの可視化における大きな進歩です。この機能により、データエンジニアやデータサイエンティストは、データの変換や外部ツールの使用なしに、PySparkの中で完結した分析ワークフローを構築できます。

特に重要なポイントは以下の3つです：

1. **シンプルさ**: Pandas風のAPIにより、学習コストを最小限に抑えながら強力な可視化機能を利用可能
2. **パフォーマンス**: 分散処理とSQL最適化により、大規模データでも高速な可視化を実現
3. **統合性**: PySparkエコシステムとシームレスに統合され、エンドツーエンドのデータパイプラインを構築可能

今後もPySpark Native Plottingは機能拡張が予定されており、より多様な可視化ニーズに対応していくことが期待されます。ぜひDatabricks Runtime 17.0で、この革新的な機能を体験してみてください。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)