問題: Delta Lake UPDATE クエリが IllegalState 例外で失敗するProblem: Delta Lake UPDATE Query Fails with IllegalState Exception

問題点Problem

変換のいずれかで Python Udf を使用する Delta Lake UPDATEDELETE、または MERGE クエリを実行すると、次の例外が発生して失敗します。When you execute a Delta Lake UPDATE, DELETE, or MERGE query that uses Python UDFs in any of its transformations, it fails with the following exception:

java.lang.UnsupportedOperationException: Error in SQL statement:
IllegalStateException: File (adl://xxx/table1) to be rewritten not found among candidate files:
adl://xxx/table1/part-00001-39cae1bb-9406-49d2-99fb-8c865516fbaa-c000.snappy.parquet

VersionVersion

この問題は、5.5 Databricks Runtime 以下で発生します。This problem occurs on Databricks Runtime 5.5 and below.

原因Cause

デルタレイクは、内部的には、UPDATEDELETEMERGEなどの操作の input_file_name() 関数に依存しています。Delta Lake internally depends on the input_file_name() function for operations like UPDATE, DELETE, and MERGE. Python UDF を評価する SELECT ステートメントで使用する場合、input_file_name() は空の値を返します。input_file_name() returns an empty value if you use it in a SELECT statement that evaluates a Python UDF. UPDATESELECT 内部でを呼び出します。これにより、ファイル名が返されず、エラーが発生します。UPDATE calls SELECT internally, which then fails to return file names and leads to the error. このエラーは、1つの Udf では発生しません。This error does not occur with Scala UDFs.

ソリューションSolution

2 つのオプションがあります。You have two options:

  • Databricks Runtime 6.0 以降を使用します。これには、 [SPARK-28153]という問題の解決策が含まれています。Use Databricks Runtime 6.0 or above, which includes the resolution to this issue: [SPARK-28153].
  • Databricks Runtime 6.0 以降を使用できない場合は、Python Udf ではなく、[の Udf] を使用します。If you can’t use Databricks Runtime 6.0 or above, use Scala UDFs instead of Python UDFs.