# Spark との併用

このドキュメントは、🤗 Datasets を Spark と併用するための簡単な入門ガイドです。特に、Spark の DataFrame を [Dataset](/docs/datasets/v5.2.0/ja/package_reference/main_classes#datasets.Dataset) オブジェクトに読み込む方法に焦点を当てています。

そこから、任意の要素に高速にアクセスでき、モデルの学習用のデータローダーとして使用できます。

## Sparkから読み込む

[Dataset](/docs/datasets/v5.2.0/ja/package_reference/main_classes#datasets.Dataset) オブジェクトは Arrow テーブルのラッパーであり、データセット内の配列から PyTorch、TensorFlow、JAX のテンソルへ高速に読み込むことを可能にします。Arrow テーブルはディスクからメモリマップリングされるため、利用可能な RAM よりも大きなデータセットを読み込むことができます。

`Dataset.from_spark()` を使用して、Spark DataFrame から [Dataset](/docs/datasets/v5.2.0/ja/package_reference/main_classes#datasets.Dataset) を取得できます:

```py
>>> from datasets import Dataset
>>> df = spark.createDataFrame(
...     data=[[1, "Elia"], [2, "Teo"], [3, "Fang"]],
...     columns=["id", "name"],
... )
>>> ds = Dataset.from_spark(df)
```

Spark ワーカーは、キャッシュディレクトリに Arrow ファイルとしてデータセットをディスクに書き込み、そこから [Dataset](/docs/datasets/v5.2.0/ja/package_reference/main_classes#datasets.Dataset) が読み込まれます。

代わりに、`IterableDataset.from_spark()` を使用してマテリアライズをスキップすることもできます。これにより、[IterableDataset](/docs/datasets/v5.2.0/ja/package_reference/main_classes#datasets.IterableDataset) が返されます。

 ```py
 >>> from datasets import IterableDataset
 >>> df = spark.createDataFrame(
 ...     data=[[1, "Elia"], [2, "Teo"], [3, "Fang"]],
 ...     columns=["id", "name"],
 ... )
 >>> ds = IterableDataset.from_spark(df)
 >>> print(next(iter(ds)))
 {"id": 1, "name": "Elia"}
 ```

### キャッシュ

`Dataset.from_spark()`を使用すると、生成される[Dataset](/docs/datasets/v5.2.0/ja/package_reference/main_classes#datasets.Dataset)はキャッシュされます。同じDataFrameに対して`Dataset.from_spark()`を複数回呼び出しても、ディスク上にArrowファイルとしてデータセットを書き込むSparkジョブは再実行されません。

`cache_dir=` を `Dataset.from_spark()` に渡すことで、キャッシュの保存先を設定できます。ワーカーと現在のマシン（ドライバー）の両方からアクセスできるディスクを使用してください。

> [!WARNING]
> 別のセッションでは、Spark DataFrame は同じ [セマンティックハッシュ](https://spark.apache.org/docs/3.2.0/api/python/reference/api/pyspark.sql.DataFrame.semanticHash.html) を持たないため、Spark ジョブを再実行し、新しいキャッシュに保存します。

### 機能タイプ

データセットが画像、音声データ、N次元配列で構成されている場合は、`Dataset.from_spark()`（または`IterableDataset.from_spark()`）で`features=`引数を指定できます。

```py
>>> from datasets import Dataset, Features, Image, Value
>>> data = [(0, open("image.png", "rb").read())]
>>> df = spark.createDataFrame(data, "idx: int, image: binary")
>>> # Also works if you have arrays
>>> # data = [(0, np.zeros(shape=(32, 32, 3), dtype=np.int32).tolist())]
>>> # df = spark.createDataFrame(data, "idx: int, image: array<array<array<int>>>")
>>> features = Features({"idx": Value("int64"), "image": Image()})
>>> dataset = Dataset.from_spark(df, features=features)
>>> dataset[0]
{'idx': 0, 'image': <PIL.PngImagePlugin.PngImageFile image mode=RGB size=32x32>}
```

利用可能なすべてのフィーチャータイプについては、[Features](/docs/datasets/v5.2.0/ja/package_reference/main_classes#datasets.Features)ドキュメントをご参照ください。

