注意事項
本記事は、2021年9月15日時点におけるDatabricksでの調査結果です。
概要
Delta Lake 1.0から利用できるようになったGenerated Column(生成列)利用時におけるMerge操作に制約があるのですが、Merge内のInsert処理時にエラーとなるようです。
Delta Lakeのドキュメントにて、Generated Columnには下記のようにMerge処理がサポートされていないことが記載されております。
引用元:Table batch reads and writes — Delta Lake Documentation
Merge処理時のどの操作をサポートしていないのを検証したところ、Update処理をサポートしておりましたが、Insert処理がサポートされていないことがわかりました。下記が、Insert処理時のエラーメッセージです。チェック制約違反となることが原因であることから、Generated Columns列の制約を満たすカラムをソースとすることでMerege操作時にはエラーとなりませんでした。
Error in SQL statement: InvariantViolationException: CHECK constraint Generated Column (
count_string
<=> > CAST(count
AS STRING)) violated by row with values:
- count : 1
- count_string : null
Databricks Runtime 9.1以降では、Insert処理にも対応するでき、実質的にMerge操作に制約がなくなるようです。
下記が実行結果です。
検証環境
databricks runtime : 9.0.x-scala2.12
Python version : 3.8.10
pyspark version : 3.1.2
検証手順
下記のGithub pagesのページをご確認ください。
Databricks Runtime 9.1での実行結果は下記のページです。
コードを実行したい方は、下記のdbcファイルを取り込んでください。
https://github.com/manabian-/databricks_tecks_for_qiita/blob/main/tecks/merge_test_generate_columns/merge_test_generate_columns.dbc