メインコンテンツまでスキップ

ファイルタイプ

適用対象: 「はい」とマークされました。 Databricks Runtime 18 LTS 以降

備考

ベータ版

この機能はベータ版です。ワークスペース管理者は、 プレビュー ページからこの機能へのアクセスを制御できます。Databricksのプレビューを管理するを参照してください。

FileType は、SQL FILE 型に対応する PySpark 型であり、非構造化ファイルとそのメタデータへの参照です。これを使用して、Python ユーザー定義関数 (UDF) で FILE パラメーターと戻り値の型を宣言します。Python では、FILE 値は FileRef オブジェクトであり、ファイルのメタデータを保持し、そのバイトを読み取ります。

SQL 型のリファレンスと概念の概要については、FILEおよびFILE 型と非構造化データを参照してください。ファイル処理 UDF の例については、UDF を使用したファイルの処理を参照してください。

注記

FILE タイプは、Serverless ノートブックではサポートされていません。これは、Serverless Databricks SQL warehouse にアタッチされたノートブックでサポートされています。

インポート

Python
from pyspark.sql.types import FileType, FileRef

ファイルタイプ

FileType pyspark.sql.types.DataType のサブクラスです。これを UDF のパラメーターまたは戻り値の型として、あるいはスキーマ内のフィールド型として使用します。

FileType MANAGED または EXTERNAL が指定されていません。これらの修飾子は FILE テーブルカラムにのみ適用されます。このカラムは、参照をマネージドとして保存するか外部として保存するかを決定します。UDF は FILE 参照を渡して返します。ターゲットカラムは、結果をテーブルに書き込む際に各参照をどのように保存するかを決定します。

FileType は以下の方法で使用できます。これは SQL および Scala UDF、ならびに SQL ストアドプロシージャにも適用されます。

  • 最上位の型として。
  • StructType または ArrayType の内部に入れ子になっています。
  • MapType の値タイプとして使用できますが、MapType キーとしては使用できません。
  • VariantType 内ですが、外部ファイルの場合に限ります。

クエリーが FILE 列を Python に返す場合(UDF 内、または DataFrame.collect() を介する場合のいずれであっても)、各値は FileRef となります。

FileRef

FileRef は、FILE の Python 値です。これにはファイルのメタデータが保持されており、ファイルのバイトを読み取り、新しい参照を作成するためのメソッドがあります。

属性

属性

Type

説明

uri

str

ファイルのURI。常に設定します。

offset

int

ファイル内のオフセット(バイト単位)。

size

int

ファイルのサイズ(バイト単位)。

content_type

str

既知の場合の、ファイルの MIME タイプ。

checksum

str

<algorithm>:<digest>形式の、ファイルのバイトに対する整合性トークン。認識されるアルゴリズムについては、チェックサムを参照してください。

属性

Type

説明

uri

str

ファイルのURI。常に設定します。

offset

int

ファイル内のオフセット(バイト単位)。

size

int

ファイルのサイズ(バイト単位)。

content_type

str

既知の場合の、ファイルの MIME タイプ。

checksum

str

<algorithm>:<digest>形式の、ファイルのバイトに対する整合性トークン。認識されるアルゴリズムについては、チェックサムを参照してください。

メソッド

手法

説明

as_local_file()

ファイルへの pathlib.Path を返します。パスを受け入れる任意のライブラリに結果を渡します。Databricks コンピュート(ノートブックおよび UDF ワーカー)で使用できます。Databricks のコンピュート外でコードを実行する IDE やローカルアプリケーションなどの Databricks Connect クライアントでは使用できません。

open()

バイナリ読み取り用にファイルを開き、ファイルオブジェクトを返します。呼び出し元がそれを閉じます。as_local_file() と同じコンピュート要件があります。

from_bytes(content, path=None, content_type=None)

クラスメソッド。pathで指定されたUnity Catalogボリュームパスにcontentbytes値)をuploadし、FileRefを返します。ターゲットパスにファイルが既に存在する場合は失敗します。UDF内でのみサポートされています。

from_local_file(local_file, path=None, content_type=None)

クラスメソッド。ローカルファイルを Unity Catalog ボリュームに upload し、FileRef を返します。path および content_type パラメーターは、from_bytes と同様に動作します。UDF 内でのみサポートされています。

手法

説明

as_local_file()

ファイルへの pathlib.Path を返します。パスを受け入れる任意のライブラリに結果を渡します。Databricks コンピュート(ノートブックおよび UDF ワーカー)で使用できます。Databricks のコンピュート外でコードを実行する IDE やローカルアプリケーションなどの Databricks Connect クライアントでは使用できません。

open()

バイナリ読み取り用にファイルを開き、ファイルオブジェクトを返します。呼び出し元がそれを閉じます。as_local_file() と同じコンピュート要件があります。

from_bytes(content, path=None, content_type=None)

クラスメソッド。pathで指定されたUnity Catalogボリュームパスにcontentbytes値)をuploadし、FileRefを返します。ターゲットパスにファイルが既に存在する場合は失敗します。UDF内でのみサポートされています。

from_local_file(local_file, path=None, content_type=None)

クラスメソッド。ローカルファイルを Unity Catalog ボリュームに upload し、FileRef を返します。path および content_type パラメーターは、from_bytes と同様に動作します。UDF 内でのみサポートされています。

以下のコードでは、スカラー UDF が FILE 値を FileRef として受け取り、画像を開いてその寸法を返します。

Python
from pyspark.sql.functions import col, udf
from pyspark.sql.types import StringType
from PIL import Image

@udf(returnType=StringType())
def image_resolution(file):
with Image.open(file.as_local_file()) as img:
return f"{img.width}x{img.height}"

spark.read.table("images").select(image_resolution(col("photo"))).display()

UDTF を使用したファイルの生成など、ファイル処理 UDF の詳細な例については、「Process files with UDFs」を参照してください。一般的なUDFの作成については、Pythonユーザー定義スカラー関数 (UDF) および Pythonユーザー定義テーブル関数 (UDTF)を参照してください。

制限事項

PySpark で FileType を使用する場合、以下の制限があります。

  • PySpark は、FILE MANAGED または FILE EXTERNAL テーブル列の宣言や、ファイルのバルク取り込みをサポートしていません。これらの操作には SQL を使用してください。PySpark は、UDF およびファイル読み取りにおいて、FileType として FILE のみをサポートしています。
  • as_local_file() および open() はクラスター側のアクセスを必要とするため、Databricks Connect クライアントでは使用できません。代わりに、UDF 内またはクラスターコンピュート上でそれらを呼び出します。
  • from_bytes および from_local_file の場合、Python UDFはパスの拡張子から content_type を推論しますが、Scala UDFはファイルのマジックバイトから推論します。
  • FILE MANAGED 列に書き込む UDF から FileRef を返すことはサポートされていません。

関連リソース