LoginSignup
0
0

More than 1 year has passed since last update.

Databricksにおけるバイナリーファイルの取り扱い

Posted at

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は、バイナリーデータソースでロードされた画像データの表示をサポートしています。

ロードされたファイルに画像の拡張子がある場合には、自動で画像のプレビューが有効化されます。

Python
df = spark.read.format("binaryFile").load("<path-to-image-dir>")
display(df)    # image thumbnails are rendered in the "content" column

あるいは、バイナリーカラムをアノテーションするために、"image/*"の文字列によるmimeTypeオプションを知いることで、画像プレビューの機能を強制することができます。バイナリーのコンテンツのフォーマット情報に基づいて画像がデコードされます。サポートされている画像はbmpgifjpegpngです。サポートされていないファイルは破損した画像のアイコンとして表示されます。

Python
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ファイルを読み込みます。

Python
df = spark.read.format("binaryFile").option("pathGlobFilter", "*.jpg").load("<path-to-dir>")

パーティション発見を無視して、入力ディレクトリ配下のファイルを再帰的に検索したい場合には、recursiveFileLookupオプションを使用します。このオプションはディレクトリがdate=2019-07-01のようなパーティションの命名規則に従っていなくても、ネストされたディレクトリを検索します。以下のコードでは、入力ディレクトリから再帰的にJPGファイルを読み込み、パーティション発見を無視します。

Python
df = spark.read.format("binaryFile") \
  .option("pathGlobFilter", "*.jpg") \
  .option("recursiveFileLookup", "true") \
  .load("<path-to-dir>")

同様のAPIをScala、Java、Rで使用できます。

注意
データを読み込む際の性能を改善するためには、バイナリーファイルからロードしたデータを保存する際に圧縮をオフにすることをお勧めします。

Python
spark.conf.set("spark.sql.parquet.compression.codec", "uncompressed")
df.write.format("delta").save("<path-to-table>")

Databricks 無料トライアル

Databricks 無料トライアル

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0