Binary file | Databricks on AWS [2021/1/19時点]の翻訳です。
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
Databricksランタイムは、バイナリーファイルを読み込み、それぞれのファイルを生のコンテンツとファイルのメタデータを含む単一のレコードに変換するバイナリーファイルデータソースをサポートしています。バイナリーファイルデータソースは、以下のカラムと場合によってはパーティションカラムを含むデータソースを生成します。
-
path (StringType): ファイルのパスです。 -
modificationTime (TimestampType): ファイルの更新時刻です。いくつかのHadoop FileSystem実装では、このパラメーターは利用できず、デフォルト値になる場合があります。 -
length (LongType): ファイルのバイト長です。 -
content (BinaryType): ファイルのコンテンツです。
バイナリーファイルを読み込むためには、データソースのformatとしてbinaryFileを指定します。
画像
画像データをロードする際にはバイナリーデータソースを使用することをお勧めします。
Databrikcsランタイム8.4以降では、Databricksのdisplayは、バイナリーデータソースでロードされた画像データの表示をサポートしています。
ロードされたファイルに画像の拡張子がある場合には、自動で画像のプレビューが有効化されます。
df = spark.read.format("binaryFile").load("<path-to-image-dir>")
display(df) # image thumbnails are rendered in the "content" column
あるいは、バイナリーカラムをアノテーションするために、"image/*"の文字列によるmimeTypeオプションを知いることで、画像プレビューの機能を強制することができます。バイナリーのコンテンツのフォーマット情報に基づいて画像がデコードされます。サポートされている画像はbmp、gif、jpeg、pngです。サポートされていないファイルは破損した画像のアイコンとして表示されます。
df = spark.read.format("binaryFile").option("mimeType", "image/*").load("<path-to-dir>")
display(df) # unsupported files are displayed as a broken image icon
画像データを取り扱う推奨のワークフローに関しては、画像アプリケーションのリファレンスソリューションをご覧ください。
オプション
パーティション発見の挙動を保ちつつも、指定されたglobパターンにマッチするパスからファイルをロードするためにpathGlobFilterオプションを使用することができます。以下のコードでは、パーティション発見を行いながらも入力ディレクトリから全てのJPGファイルを読み込みます。
df = spark.read.format("binaryFile").option("pathGlobFilter", "*.jpg").load("<path-to-dir>")
パーティション発見を無視して、入力ディレクトリ配下のファイルを再帰的に検索したい場合には、recursiveFileLookupオプションを使用します。このオプションはディレクトリがdate=2019-07-01のようなパーティションの命名規則に従っていなくても、ネストされたディレクトリを検索します。以下のコードでは、入力ディレクトリから再帰的にJPGファイルを読み込み、パーティション発見を無視します。
df = spark.read.format("binaryFile") \
.option("pathGlobFilter", "*.jpg") \
.option("recursiveFileLookup", "true") \
.load("<path-to-dir>")
同様のAPIをScala、Java、Rで使用できます。
注意
データを読み込む際の性能を改善するためには、バイナリーファイルからロードしたデータを保存する際に圧縮をオフにすることをお勧めします。
spark.conf.set("spark.sql.parquet.compression.codec", "uncompressed")
df.write.format("delta").save("<path-to-table>")

