バイナリファイルを読み込む
Databricksは、バイナリファイルを読み込み、各ファイルを、ファイルの生のコンテンツとメタデータを含む単一のレコードに変換するバイナリファイルデータソースをサポートしています。画像、音声、PDFファイルなどの非構造化データは、後続処理や機械学習推論のために一般的にロードされます。バイナリファイルを読み取るには、データソース format を binaryFileとして指定します。
前提条件
Databricks はバイナリファイルの使用に追加の設定は必要ありません。
オプション
DataFrameReaderの.option()と.options()のメソッドを使用して、バイナリファイルのデータソースを構成します。サポートされているオプションの完全なリストについては、Spark API オプション参照をご覧ください。
出力スキーマ
バイナリファイル・データソースは、次のカラムと、場合によってはパーティション・カラムも含む DataFrame を生成します:
path (StringType): ファイルのパス。modificationTime (TimestampType):ファイルの更新時刻。一部の Hadoop ファイルシステムの実装では、このパラメーターが使用できない場合があり、その場合はデフォルト値が設定されます。length (LongType): ファイルの長さ (バイト単位)。content (BinaryType): ファイルの内容。
使い方
以下の例では、Spark DataFrame API および SQL を使用したバイナリファイルの読み込み、ファイルタイプによるフィルタリング、画像プレビューの表示、および読み取りパフォーマンスを向上させるための Delta テーブルへの保存について示しています。
バイナリファイルを読み込む
Apache Spark DataFrame API を使用して、変換、表示、またはダウンストリーム処理のためにバイナリファイルを DataFrame にロードします。
- Python
- Scala
- SQL
df = spark.read.format("binaryFile").load("/Volumes/<catalog>/<schema>/<volume>/")
display(df)
val df = spark.read.format("binaryFile").load("/Volumes/<catalog>/<schema>/<volume>/")
df.show()
SELECT path, length, modificationTime FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/images/',
format => 'binaryFile'
)
読み取りオプションを構成する
パーティション検出の動作を維持しながら、特定の glob パターンに一致するパスを持つファイルをロードするには、
pathGlobFilter オプションを使用できます。 次のコードは、すべての JPG ファイルを
パーティション検出を含む入力ディレクトリ:
- Python
- Scala
- SQL
df = spark.read.format("binaryFile").option("pathGlobFilter", "*.jpg").load("/Volumes/<catalog>/<schema>/<volume>/images/")
val df = spark.read.format("binaryFile").option("pathGlobFilter", "*.jpg").load("/Volumes/<catalog>/<schema>/<volume>/images/")
SELECT * FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/images/',
format => 'binaryFile',
pathGlobFilter => '*.jpg'
)
パーティションの検出を無視して、入力ディレクトリの下のファイルを再帰的に検索する場合は、
recursiveFileLookup オプションを使用します。 このオプションは、ネストされたディレクトリを検索します
名前 が date=2019-07-01.次のコードは、入力ディレクトリからすべての JPG ファイルを再帰的に読み取り、パーティションの検出を無視します。
- Python
- Scala
- SQL
df = (spark.read.format("binaryFile")
.option("pathGlobFilter", "*.jpg")
.option("recursiveFileLookup", "true")
.load("/Volumes/<catalog>/<schema>/<volume>/images/"))
val df = spark.read.format("binaryFile")
.option("pathGlobFilter", "*.jpg")
.option("recursiveFileLookup", "true")
.load("/Volumes/<catalog>/<schema>/<volume>/images/")
SELECT * FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/images/',
format => 'binaryFile',
pathGlobFilter => '*.jpg',
recursiveFileLookup => true
)
画像を読み込んで表示する
Databricks では、バイナリファイルデータソースを使用して、イメージデータをロードすることをお勧めします。Databricks display 関数は、バイナリ データソースを使用してロードされた画像データの表示をサポートしています。
読み込まれたすべてのファイルのファイル名に 画像拡張子が付いている場合、画像のプレビューは自動的に有効になります。
- Python
- Scala
- SQL
df = spark.read.format("binaryFile").load("/Volumes/<catalog>/<schema>/<volume>/images/")
display(df) # image thumbnails are rendered in the "content" column
val df = spark.read.format("binaryFile").load("/Volumes/<catalog>/<schema>/<volume>/images/")
df.show()
SELECT * FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/images/',
format => 'binaryFile'
)

または、文字列値 "image/*" で mimeType オプションを使用してバイナリ列に注釈を付けることで、イメージ プレビュー機能を強制することもできます。画像は、バイナリ コンテンツ内の形式情報に基づいてデコードされます。 サポートされているイメージ タイプは、 bmp、 gif、 jpeg、および pngです。 サポートされていないファイルは、壊れた画像アイコンとして表示されます。
- Python
- Scala
- SQL
df = spark.read.format("binaryFile").option("mimeType", "image/*").load("/Volumes/<catalog>/<schema>/<volume>/images/")
display(df)
val df = spark.read.format("binaryFile").option("mimeType", "image/*").load("/Volumes/<catalog>/<schema>/<volume>/images/")
df.show()
SELECT * FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/images/',
format => 'binaryFile',
mimeType => 'image/*'
)

画像データの処理に推奨されるワークフローについては、 画像アプリケーションのリファレンス ソリューション を参照してください。
Delta テーブルに保存
読み取りパフォーマンスを向上させるため、Databricksは、バイナリファイルから読み込んだデータをDeltaテーブルに保存することをお勧めします。
- Python
- Scala
df.write.format("delta").saveAsTable("<catalog>.<schema>.<table>")
df.write.format("delta").saveAsTable("<catalog>.<schema>.<table>")
その他のリソース
- 画像ファイルを読み取る:ワークロードで、生のバイトではなく、高さ、幅、チャンネルデータなどの構造化された画像フィールドが必要とされる場合、イメージ データソースがデコードされたスキーマを提供します。