Delta Lakeに対するFAQ

[Frequently asked questions \(FAQ\) \| Databricks on AWS](https://docs.databricks.com/delta/delta-faq.html)(2021/3/17時点)の翻訳です。

# Delta Lakeとは何ですか？

[Delta Lake](https://delta.io/)は、[データレイク](https://databricks.com/discover/data-lakes/introduction)に信頼性をもたらす[オープンソースストレージレイヤ](https://github.com/delta-io/delta)です。Delta LakeはACIDトランザクション、スケーラブルなメタデータ操作、データに対するストリーミング・バッチ処理の統合を可能にします。Delta Lakeはあなたがお持ちのデータレイク上で動作し、Apache Spark APIと完全な互換性があります。

DatabricksのDelta Lakeを活用することで、ワークロードのパターンに応じて最適なインデックスとレイアウトを提供し、高速なインタラクティブクエリを実現します。

# Delta LakeとApache Sparkの関係はどうなっていますか？

Delta LakeはApache Sparkの上位に位置付けられます。この組み合わせは巨大なデータパイプラインの構築をシンプルにし、パイプライン全体の効率を改善します。

# Delta Lakeがデータを格納する際、どのようなフォーマットを使っていますか？

Delta Lakeは、データをクラウドストレージに保管する際、バージョン管理されたParquetファイルを使用します。バージョン以外にも、Delta LakeはテーブルあるいはBLOBを格納しているディレクトリに対してなされたコミットのトランザクションログを格納することでACIDトランザクションを実現しています。

# どのようにしてDelta Lakeに対して読み書きができますか？

Delta Lakeに対する読み書きは、好みのApache Spark APIを介して行うことができます。[テーブルの読み込み](https://docs.databricks.com/delta/delta-batch.html#deltadataframereads)、[テーブルへの書き込み](https://docs.databricks.com/delta/delta-batch.html#deltadataframewrites)を参照ください。

# Delta Lakeはどこにデータを格納しますか？

データを書き込む際に、クラウドストレージ上の位置を指定できます。指定された場所に、Delta LakeがParquet形式で書き込みを行います。

# Delta Lakeで削除したはずのデータがS3にあるのはどうしてですか？

Delta Lakeを使用していて、かつ[バケットのバージョン管理](https://docs.databricks.com/administration-guide/account-settings/aws-storage.html#bucket-versioning)を有効化している場合、あなたはテーブルファイルを管理する二つのエンティティを持つことになります：Delta LakeとAWSです。データが完全に削除されたことを確実にするためには、以下の操作が必要です：

- `VACUUM`を使用して、Delta Lakeトランザクションログに存在しないファイルを[削除](https://docs.databricks.com/delta/delta-utility.html#delta-vacuum)する。
- バージョン管理されたオブジェクトに対するS3のライフサイクルポリシーを有効化し、削除されたファイルの古いバージョンがパージされるようにする。

# Delta Lakeファイルを`rm -rf`で削除して、同じ場所に新たなテーブルを作成したのですが、テーブルが古いデータを表示するのはなぜですか？

S3における削除は、結果的整合性のみを保証します。すなわち、テーブルでの削除後も、しばらくの間トランザクションログの古いバージョンが見え続けます。これを避けるためには、削除後に同じパスを使いまわさないでください。代わりに、テーブルを削除、更新する際にはトランザクションをサポートした`DELETE FROM`、`overrite`、`overwriteSchema`などを使用して下さい。[テーブルを置換する際のベストプラクティス](https://docs.databricks.com/delta/best-practices.html#delta-replace-table)を参照ください。

# Deltaテーブルに対して、ストリームで読み書きができますか？

はい、Deltaテーブルに対して構造化ストリーミングを用いて直接データを書き込んだり、データを読み込んだりできます。[Deltaテーブルに対するストリームデータ](https://docs.databricks.com/delta/delta-streaming.html#stream-sink)、[Deltaテーブルからのストリームデータ](https://docs.databricks.com/delta/delta-streaming.html#stream-source)を参照ください。

# Delta LakeはSparkのStreaming DStream APIをサポートしていますか？

DeltaはDStream APIをサポートしていません。[ストリーミングによるテーブルの読み書き](https://docs.databricks.com/delta/delta-streaming.html)を行うことをお勧めしています。

# Delta Lakeを使用する際、自分のコードを他のSparkプラットフォームに容易に移植することは可能ですか？

はい、Delta Lakeを使用する際、あなたはApache Spark APIを使うことになりますので、他のSparkプラットフォームにコードを容易に移植できます。移植の際には、`delta`フォーマットを`parquet`フォーマットに切り替えて下さい。

# DeltaテーブルとHiveのSerDeテーブルの違いは何ですか？

Deltaテーブルはより広い範囲で管理されています。特に、いくつかのSerDeのパラメータはあなたの代わりにDelta Lakeが管理しており、あなたが手動で指定する必要はありません：

- ROWFORMAT
- SERDE
- OUTPUTFORMAT及びINPUTFORMAT
- COMPRESION
- STORED AS

# Delta LakeがサポートしていないDDL、DMLは何ですか？

- サポートされていないDDL：
    - ANALYZE TABLE PARTITION
    - ALTER TABLE [ADD|DROP] PARTITION
    - ALTER TABLE RECOVER PARTITIONS
    - ALTER TABLE SET SERDEPROPERTIES
    - CREATE TABLE LIKE
    - INSERT OVERWRITE DIRECTORY
    - LOAD DATA

- サポートされていないDML：
    - 静的パーティションのテーブルに対するINSERT INTO [OVERWRITE]
    - 動的パーティションのテーブルに対するINSERT OVERWRITE TABLE
    - バケッティング
    - テーブルから読み込む際のスキーマ指定
    - TRUNCATE TABLEにおいて、PARTITION (part_spec)を用いた対象パーティションの指定

# Delta Lakeはマルチテーブルのトランザクションをサポートしていますか？

Delta Lakeはマルチテーブルのトランザクション、外部キーをサポートしていません。Delta Lakeはテーブルレベルのトランザクションをサポートしています。

# どうすればカラムの型を変更できますか？

カラムの型の変更やカラムの削除には、テーブルの再書き込みが必要となります。[カラム型の変更](https://docs.databricks.com/delta/delta-batch.html#change-column-type)を参照ください

# Delta Lakeがマルチクラスターの書き込みをサポートしているとはどういう意味ですか？

複数のクラスターが同時にテーブルを書き込みを行う際、ロックを行わずテーブルを破損しないということを意味します。しかし、これは書き込みの競合(例えば、同じものに対する更新と削除)が発生した際に、両方の書き込みが成功することを意味しません。代わりに、原子的に一方の書き込みが失敗し、操作を再度実行するようにエラーを通知します。

# マルチクラスター書き込みの制限は何ですか？

このモードで動作する際の機能制限は以下の通りです：

- Databricksランタイム7.5以下での[SparkR](https://docs.databricks.com/spark/latest/sparkr/index.html)。Databricks 7.6以上であればSparkRでのマルチクラスター書き込みはサポートしています。
- Databricksランタイム7.2以下での[spark\-submit jobs](https://docs.databricks.com/dev-tools/api/latest/examples.html#spark-submit-api-example)。Databricks 7.3以上であればspark-submit jobsでのマルチクラスター書き込みはサポートしています。
- [顧客管理のキーによるサーバーサイド暗号化](https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html)
- [AWS Security Token Service](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html)にアクセスできないクラスターで、認証情報を伴うS3パス

`spark.databricks.delta.multiClusterWrites.enabled`を`false`に設定することで、マルチクラスター書き込みを無効化できます。無効化された場合には、単一のテーブルに対する書き込みは単一のクラスターから行われる必要があります。

> **警告!**
異なるワークスペースから同じDeltaテーブルを同時に編集することはできません。

# Databricksランタイムの外からDeltaテーブルにアクセスできますか？

検討すべき二つのケースがあります：外部からの書き込みと読み取りです。

- 外部からの書き込み：読み取り元に対してスナップショットのアイソレーションとACIDトランザクションを提供するために、Delta Lakeはトランザクションログという形で追加のメタデータを管理しています。正しくトランザクションログが更新され、適切な検証が行われるように、書き込み処理はDatabricksランタイムを経由する必要があります。
- 外部からの読み取り：Deltaテーブルでは、データがオープンフォーマットでエンコードされていますので、フォーマットを解する外部ツールであればデータを読み取ることが可能です。どのようにDeltaテーブルを読み取るかに関しては、[インテグレーション](https://docs.databricks.com/delta/integrations.html)を参照ください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)