

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Delta Lake
<a name="emr-delta"></a>

Delta Lake 是一個用於 Lakehouse 架構的儲存層架構，通常建置在 Amazon S3 上。透過 Amazon EMR 6.9.0 版及更高版本，您可以在具有 Delta Lake 資料表的 Amazon EMR 叢集上使用 [Apache Spark](https://aws.amazon.com/emr/features/spark/) 3.x。如需有關具有 Delta Lake 的 Lakehouse 的詳細資訊，請參閱 [https://delta.io/](https://delta.io/)。

以下表格列出了 Amazon EMR 7.x 系列最新版本中包含的 Delta 版本，以及 Amazon EMR 隨 Delta 一起安裝的元件。

如需此版本中與 Delta 一起安裝的元件版本，請參閱[發行版本 7.12.0 元件版本。](emr-7120-release.md)


**emr-7.12.0 的 Delta 版本資訊**  

| Amazon EMR 發行標籤 | Delta 版本 | 與 Delta 一起搭配安裝的元件 | 
| --- | --- | --- | 
| emr-7.12.0 | Delta 3.3.2-amzn-1 | Not available. | 

下表列出 Amazon EMR 6.x 系列最新版本中包含的 Delta 版本，以及 Amazon EMR 隨 Delta 一起安裝的元件。

如需此版本中與 Delta 一起搭配安裝的元件版本，請參閱[發行版本 6.15.0 元件版本](emr-6150-release.md)。


**emr-6.15.0 的 Delta 版本資訊**  

| Amazon EMR 發行標籤 | Delta 版本 | 與 Delta 一起搭配安裝的元件 | 
| --- | --- | --- | 
| emr-6.15.0 | Delta 2.4.0 | Not available. | 

# Delta Lake 簡介
<a name="Deltaintro"></a>

Delta Lake 是一種開放原始碼專案，可協助實作通常在 Amazon S3 上建置的現代化資料湖架構。Delta Lake 提供下列功能：
+ Spark 上的原子、一致、隔離和耐用 (ACID) 交易。在 Spark 作業期間，讀者會看到資料表的一致性檢視。
+ 透過 Spark 進行分散式處理的可擴展中繼資料處理。
+ 將串流和批次使用案例與相同的 Delta 資料表結合在一起。
+ 自動強制執行結構描述，以避免資料擷取期間出現錯誤記錄。
+ 具有資料版本控制的時間歷程。
+ 支援複雜使用案例的合併、更新和刪除操作，例如變更資料擷取 (CDC)、串流 upsert 等。

# 使用已安裝 Delta Lake 的叢集
<a name="Deltausing-cluster"></a>

**Topics**
+ [

# 將 Delta Lake 叢集與 Flink 搭配使用
](Deltacluster-flink.md)
+ [

# 將 Delta Lake 叢集與 Trino 搭配使用
](Deltacluster-trino.md)
+ [

# 將 Delta Lake 叢集與 Spark 搭配使用
](Deltausing-cluster-spark.md)
+ [

# 使用 Delta Lake 叢集搭配 Spark 和 AWS Glue
](Deltacluster-spark-glue.md)

# 將 Delta Lake 叢集與 Flink 搭配使用
<a name="Deltacluster-flink"></a>

使用 Amazon EMR 6.11 版及更高版本，您可以將 Delta Lake 與 Flink 叢集搭配使用。下列範例使用 AWS CLI 在 Amazon EMR Flink 叢集上使用 Delta Lake。

**注意**  
當您將 Delta Lake 與 Flink 叢集搭配使用時，Amazon EMR 支援 Flink DataStream API。

## 建立 Delta Lake 叢集
<a name="Deltacreate-a-delta-cluster"></a>

1. 使用下列內容建立檔案 `delta_configurations.json`：

   ```
   [{"Classification":"delta-defaults",  
       "Properties":{"delta.enabled":"true"}}]
   ```

1. 使用下列組態建立叢集。將 `example Amazon S3 bucket path` 和 `subnet ID` 取代為您自己的值。

   ```
   aws emr create-cluster 
   --release-label emr-6.11.0   
   --applications Name=Flink  
   --configurations file://delta_configurations.json   
   --region us-east-1  --name My_Spark_Delta_Cluster  
   --log-uri  s3://amzn-s3-demo-bucket/  
   --instance-type m5.xlarge  
   --instance-count 3   
   --service-role EMR_DefaultRole_V2  
   --ec2-attributes  InstanceProfile=EMR_EC2_DefaultRole,SubnetId=subnet-1234567890abcdef0
   ```

## 初始化 Flink yarn 工作階段
<a name="Deltainit-flink-yarn"></a>

若要初始化 Flink yarn 工作階段，請執行下列命令：

```
flink-yarn-session -d
```

## 使用 Delta Lake 建置 Flink 作業
<a name="Deltabuild-flink-with-delta-lake"></a>

下列範例示範如何使用 sbt 或 Maven 透過 Delta Lake 建置 Flink 作業。

------
#### [ sbt ]

[sbt](https://www.scala-sbt.org/1.x/docs/index.html) 是用於 Scala 的建置工具，當您有小型專案時，只需很少的組態甚至無需組態即可使用。

```
libraryDependencies ++= Seq(
  "io.delta" %% "delta-flink" % deltaConnectorsVersion % "provided",
  "io.delta" %% "delta-standalone" % deltaConnectorsVersion % "provided",
  "org.apache.flink" %% "flink-clients" % flinkVersion % "provided",
  "org.apache.flink" %% "flink-parquet" % flinkVersion % "provided",
  "org.apache.hadoop" % "hadoop-client" % hadoopVersion % "provided",
  "org.apache.flink" % "flink-table-common" % flinkVersion % "provided",
  "org.apache.flink" %% "flink-table-runtime" % flinkVersion % "provided")
```

------
#### [ Maven ]

[Maven](https://maven.apache.org) 是來自 Apache Software Foundation 的開放原始碼建置自動化工具。使用 Maven，您可以在 Amazon EMR 上使用 Delta Lake 建置、發布和部署 Flink 作業。

```
<project>
<properties>
    <scala.main.version>2.12</scala.main.version>
    <delta-connectors-version>0.6.0</delta-connectors-version>
    <flink-version>1.16.1</flink-version>
    <hadoop-version>3.1.0</hadoop-version>
</properties>

<dependencies>
    <dependency>
        <groupId>io.delta</groupId>
        <artifactId>delta-flink</artifactId>
        <version>$delta-connectors-version</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>io.delta</groupId>
        <artifactId>delta-standalone_$scala-main-version</artifactId>
        <version>$delta-connectors-version</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-clients</artifactId>
        <version>$flink-version</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-parquet</artifactId>
        <version>$flink-version</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>$hadoop-version</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-table-common</artifactId>
        <version>$flink-version</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-table-runtime</artifactId>
        <version>$flink-version</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
```

------

## 使用 Flink Datastream API 寫入至 Delta 資料表
<a name="Deltawrite-delta-table-with-flink-datastream-api"></a>

使用下列範例建立 DeltaSink 以寫入至具有 `deltaTablePath:` 的資料表

```
public static DataStream<RowData> createDeltaSink(
        DataStream<RowData> stream,
        String deltaTablePath,
        RowType rowType) {
    Configuration configuration = new Configuration();
    DeltaSink<RowData> deltaSink = DeltaSink
            .forRowData(
                    new org.apache.flink.core.fs.Path(deltaTablePath),
                    configuration,
                    rowType)
            .build();
    stream.sinkTo(deltaSink);
    return stream;
}
```

## 使用 Flink Datastream API 從 Delta 資料表中讀取
<a name="Deltaread-delta-table-with-flink-datastream-api"></a>

使用下列範例建立一個限制的 DeltaSource 以從具有 `deltaTablePath:` 的資料表中讀取

```
public static DataStream<RowData> createBoundedDeltaSourceAllColumns(
        StreamExecutionEnvironment env,
        String deltaTablePath) {
    Configuration configuration = new Configuration();
    DeltaSource<RowData> deltaSource = DeltaSource
            .forBoundedRowData(
                    new org.apache.flink.core.fs.Path(deltaTablePath),
                    configuration)
            .build();

    return env.fromSource(deltaSource, WatermarkStrategy.noWatermarks(), "delta-source");
}
```

## 為 Delta Lake 獨立版建立具有多叢集支援的接收器
<a name="Deltasink-creation-with-multi-cluster"></a>

使用下列範例建立 DeltaSink 以寫入至具有 `deltaTablePath` 和[多叢集支援](https://docs.delta.io/latest/delta-standalone.html#multi-cluster-setup)的資料表

```
public DataStream<RowData> createDeltaSink(
        DataStream<RowData> stream,
        String deltaTablePath) {
    Configuration configuration = new Configuration();
    configuration.set("spark.delta.logStore.s3.impl", "io.delta.storage.S3DynamoDBLogStore");
    configuration.set("spark.io.delta.storage.S3DynamoDBLogStore.ddb.tableName", "delta_log");
    configuration.set("spark.io.delta.storage.S3DynamoDBLogStore.ddb.region", "us-east-1");
        
    DeltaSink<RowData> deltaSink = DeltaSink
        .forRowData(
            new Path(deltaTablePath),
            configuration,
            rowType)
        .build();
    stream.sinkTo(deltaSink);
    return stream;
}
```

## 執行 Flink 作業
<a name="Deltarun-flink-job"></a>

使用下列命令來執行您的作業：

```
flink run FlinkJob.jar
```

# 將 Delta Lake 叢集與 Trino 搭配使用
<a name="Deltacluster-trino"></a>

使用 Amazon EMR 6.9.0 版及更高版本，您可以將 Delta Lake 與 Trino 叢集搭配使用。

在本教學課程中，我們將使用 AWS CLI 在 Amazon EMR Trino 叢集上使用 Delta Lake。

## 
<a name="Deltacluster-trino-create"></a>

**建立 Delta Lake 叢集**

1. 建立檔案 `delta_configurations.json`，並為您選擇的型錄設定值。例如，如果您想要使用 Hive 中繼存放區作為型錄，您的檔案應具有下列內容：

   ```
   [{"Classification":"delta-defaults",  
       "Properties":{"delta.enabled":"true"}},  
       {"Classification":"trino-connector-delta",  
       "Properties":{"hive.metastore.uri":"thrift://localhost:9083"}}]
   ```

   如果您想要使用 AWS Glue Catalog 做為您的存放區，您的檔案應具有下列內容：

   ```
   [{"Classification":"delta-defaults",  
       "Properties":{"delta.enabled":"true"}},  
       {"Classification":"trino-connector-delta",  
       "Properties":{"hive.metastore":"glue"}}]
   ```

1. 使用下列組態建立叢集，並將 **example Amazon S3 bucket path** 和 **subnet ID** 取代為您自己的值。

   ```
   aws emr create-cluster 
       --release-label emr-6.9.0   
       --applications Name=Trino  
       --configurations file://delta_configurations.json   
       --region us-east-1  --name My_Spark_Delta_Cluster  
       --log-uri  s3://amzn-s3-demo-bucket/  
       --instance-type m5.xlarge  
       --instance-count 2   
       --service-role EMR_DefaultRole_V2  
       --ec2-attributes  InstanceProfile=EMR_EC2_DefaultRole,SubnetId=subnet-1234567890abcdef0
   ```

## 初始化 Delta Lake 的 Trino 工作階段
<a name="Deltainitialize-trino"></a>

若要初始化 Trino 工作階段，請執行下列命令

```
trino-cli --catalog delta
```

## 寫入至 Delta Lake 資料表
<a name="Deltatrino-write-table"></a>

使用下列 SQL 命令建立並寫入至資料表：

```
SHOW SCHEMAS;

CREATE TABLE default.delta_table (id  int, data varchar, category varchar) WITH 
( location =  's3://amzn-s3-demo-bucket/<prefix>');

INSERT INTO default.delta_table VALUES  (1,'a','c1'), (2,'b','c2'), (3,'c','c3');
```

## 從 Delta Lake 資料表中讀取
<a name="Deltatrino-read-table"></a>

使用下列 SQL 命令從資料表中讀取：

```
SELECT * from default.delta_table;
```

# 將 Delta Lake 叢集與 Spark 搭配使用
<a name="Deltausing-cluster-spark"></a>

從 Amazon EMR 6.9.0 版開始，您可以將 Delta Lake 與 Spark 叢集搭配使用，而無需執行引導操作。對於 Amazon EMR 6.8.0 版及更低版本，您可以使用引導操作來預先安裝必要的依存項目。

下列範例使用 AWS CLI 在 Amazon EMR Spark 叢集上使用 Delta Lake。

若要將 Delta Lake on Amazon EMR 與 搭配使用 AWS Command Line Interface，請先建立叢集。如需有關如何使用 指定 Delta Lake 分類的資訊 AWS Command Line Interface，請參閱[在建立叢集 AWS Command Line Interface 時使用 提供組態](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps-create-cluster.html#emr-configure-apps-create-cluster-cli)，或在[建立叢集時使用 Java 開發套件提供組態](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps-create-cluster.html#emr-configure-apps-create-cluster-sdk)。

1. 使用下列內容建立檔案 `configurations.json`：

   ```
   [{"Classification":"delta-defaults",  "Properties":{"delta.enabled":"true"} }]
   ```

1. 使用下列組態建立叢集，並將範例 Amazon S3 **bucket path** 和 **subnet ID** 取代為您自己的值。

   ```
   aws emr create-cluster 
        --release-label  emr-6.9.0  
        --applications Name=Spark  
        --configurations file://delta_configurations.json   
        --region us-east-1  
        --name My_Spark_Delta_Cluster  
        --log-uri  s3://amzn-s3-demo-bucket/  
        --instance-type m5.xlarge  
        --instance-count 2   
        --service-role EMR_DefaultRole_V2  
        --ec2-attributes  InstanceProfile=EMR_EC2_DefaultRole,SubnetId=subnet-1234567890abcdef0
   ```

   或者，您可以建立 Amazon EMR 叢集和 Spark 應用程式，並將下列檔案作為 Spark 作業中的 JAR 依存項目：

   ```
   /usr/share/aws/delta/lib/delta-core.jar,
   /usr/share/aws/delta/lib/delta-storage.jar,    
   /usr/share/aws/delta/lib/delta-storage-s3-dynamodb.jar
   ```
**注意**  
如果您使用 Amazon EMR 7.0.0 版或更新版本，請使用 `/usr/share/aws/delta/lib/delta-spark.jar`而非 `/usr/share/aws/delta/lib/delta-core.jar`。

   如需詳細資訊，請參閱[提交應用程式](https://spark.apache.org/docs/latest/submitting-applications.html#submitting-applications)。

   若要在 Spark 作業中包含 jar 依存項目，您可以將下列組態屬性新增至 Spark 應用程式：

   ```
   --conf “spark.jars=/usr/share/aws/delta/lib/delta-core.jar,
        /usr/share/aws/delta/lib/delta-storage.jar,
        /usr/share/aws/delta/lib/delta-storage-s3-dynamodb.jar"
   ```

   如需有關 Spark 作業相依性的詳細資訊，請參閱[相依性管理](https://spark.apache.org/docs/latest/running-on-kubernetes.html#dependency-management)。

   如果您使用 Amazon EMR 7.0.0 版或更新版本，請改為新增`/usr/share/aws/delta/lib/delta-spark.jar`組態。

   ```
   --conf “spark.jars=/usr/share/aws/delta/lib/delta-spark.jar,
        /usr/share/aws/delta/lib/delta-storage.jar,
        /usr/share/aws/delta/lib/delta-storage-s3-dynamodb.jar"
   ```

## 初始化 Delta Lake 的 Spark 工作階段
<a name="Deltainitialize-spark-session"></a>

下列範例顯示如何啟動互動式 Spark Shell、使用 Spark 提交，或透過 Amazon EMR Notebooks 在 Amazon EMR 上使用 Delta Lake。

------
#### [ spark-shell ]

1. 使用 SSH 連接至主節點。如需詳細資訊，請參閱《Amazon EMR 管理指南》**中的[使用 SSH 連接至主節點](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html)。

1. 輸入以下命令啟動 Spark shell。若要使用 PySpark Shell，請將 `spark-shell` 取代為 `pyspark`。

   ```
   spark-shell \
      --conf "spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension" \
      --conf "spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog"
   ```

   如果您執行 Amazon EMR 6.15.0 版或更新版本，您還必須使用下列組態，以使用根據 Lake Formation 搭配 Delta Lake 的精細存取控制。

   ```
   spark-shell \  
     --conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension,com.amazonaws.emr.recordserver.connector.spark.sql.RecordServerSQLExtension \  
     --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog \  
     --conf spark.sql.catalog.spark_catalog.lf.managed=true
   ```

------
#### [ spark-submit ]

1. 使用 SSH 連接至主節點。如需詳細資訊，請參閱《Amazon EMR 管理指南》**中的[使用 SSH 連接至主節點](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html)。

1. 輸入下列命令啟動 Delta Lake 的 Spark 工作階段。

   ```
   spark-submit  
   —conf "spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension" 
   —conf "spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog"
   ```

   如果您執行 Amazon EMR 6.15.0 版或更新版本，您還必須使用下列組態，以使用根據 Lake Formation 搭配 Delta Lake 的精細存取控制。

   ```
   spark-submit \  `
   --conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension,com.amazonaws.emr.recordserver.connector.spark.sql.RecordServerSQLExtension 
   --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog \  
   --conf spark.sql.catalog.spark_catalog.lf.managed=true
   ```

------
#### [ EMR Studio notebooks ]

若要使用 Amazon EMR Studio 筆記本初始化 Spark 工作階段，請使用 Amazon EMR Notebooks 中的 **%%configure** 魔法命令來設定 Spark 工作階段，如下列範例所示。如需詳細資訊，請參閱《Amazon EMR 管理指南》**中的[使用 EMR Notebooks 魔法](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-magics.html#emr-magics)。

```
%%configure -f
{
  "conf": {
    "spark.sql.extensions":  "io.delta.sql.DeltaSparkSessionExtension",
     "spark.sql.catalog.spark_catalog":  "org.apache.spark.sql.delta.catalog.DeltaCatalog"
  }
}
```

如果您執行 Amazon EMR 6.15.0 版或更新版本，您還必須使用下列組態，以使用根據 Lake Formation 搭配 Delta Lake 的精細存取控制。

```
%%configure -f   
{
  "conf": {
    "spark.sql.extensions": "io.delta.sql.DeltaSparkSessionExtension,com.amazonaws.emr.recordserver.connector.spark.sql.RecordServerSQLExtension",
    "spark.sql.catalog.spark_catalog": "org.apache.spark.sql.delta.catalog.DeltaCatalog",
    "spark.sql.catalog.spark_catalog.lf.managed": "true"
  }
}
```

------

## 寫入至 Delta Lake 資料表
<a name="Deltawrite-to-table"></a>

下列範例顯示如何建立 DataFrame 並將其寫入為 Delta Lake 資料集。此範例顯示如何使用 Spark Shell 處理資料集，同時使用 SSH 作為預設 hadoop 使用者連接至主節點。

**注意**  
若要將程式碼範例貼到 Spark Shell 中，請在提示字元中鍵入 :paste、貼上範例，然後按 CTRL \$1 D。

------
#### [ PySpark ]

Spark 包含 Python 型 Shell `pyspark`，您可以使用該 Shell 來開發以 Python 撰寫之 Spark 程式的原型。如同使用 `spark-shell`，在主節點上調用 `pyspark`。

```
## Create a DataFrame
data =  spark.createDataFrame([("100", "2015-01-01", "2015-01-01T13:51:39.340396Z"),
("101",  "2015-01-01", "2015-01-01T12:14:58.597216Z"),
("102", "2015-01-01", "2015-01-01T13:51:40.417052Z"),
("103",  "2015-01-01",  "2015-01-01T13:51:40.519832Z")],
["id", "creation_date",  "last_update_time"])

## Write a DataFrame as a Delta Lake dataset to the S3  location
spark.sql("""CREATE  TABLE IF NOT EXISTS delta_table (id string, creation_date string, 
last_update_time string)
USING delta location
's3://amzn-s3-demo-bucket/example-prefix/db/delta_table'""");

data.writeTo("delta_table").append()
```

------
#### [ Scala ]

```
import org.apache.spark.sql.SaveMode
import org.apache.spark.sql.functions._
 
// Create a DataFrame
val data = Seq(("100",  "2015-01-01",  "2015-01-01T13:51:39.340396Z"),
("101",  "2015-01-01",  "2015-01-01T12:14:58.597216Z"),
("102",  "2015-01-01", "2015-01-01T13:51:40.417052Z"),
("103",  "2015-01-01",  "2015-01-01T13:51:40.519832Z")).toDF("id", "creation_date",  "last_update_time")

// Write a DataFrame as a Delta Lake dataset to the S3  location
spark.sql("""CREATE  TABLE IF NOT EXISTS delta_table (id string,
creation_date string,
last_update_time string)
USING delta location
's3://amzn-s3-demo-bucket/example-prefix/db/delta_table'""");

data.write.format("delta").mode("append").saveAsTable("delta_table")
```

------
#### [ SQL ]

```
-- Create a Delta  Lake table with the S3 location
CREATE TABLE delta_table(id string,
creation_date string, 
last_update_time string)
USING delta LOCATION
's3://amzn-s3-demo-bucket/example-prefix/db/delta_table';

-- insert data into the table
INSERT INTO delta_table VALUES  ("100", "2015-01-01",  "2015-01-01T13:51:39.340396Z"),
("101",  "2015-01-01",  "2015-01-01T12:14:58.597216Z"),
("102",  "2015-01-01", "2015-01-01T13:51:40.417052Z"),
("103",  "2015-01-01", "2015-01-01T13:51:40.519832Z");
```

------

## 從 Delta Lake 資料表中讀取
<a name="Deltaread-from-table"></a>

------
#### [ PySpark ]

```
ddf = spark.table("delta_table")
ddf.show()
```

------
#### [ Scala ]

```
val ddf =  spark.table("delta_table")
ddf.show()
```

------
#### [ SQL ]

```
SELECT * FROM delta_table;
```

------

# 使用 Delta Lake 叢集搭配 Spark 和 AWS Glue
<a name="Deltacluster-spark-glue"></a>

若要使用 AWS Glue Catalog 做為 Delta Lake 資料表的中繼存放區，請使用下列步驟建立叢集。如需使用 指定 Delta Lake 分類的資訊 AWS Command Line Interface，請參閱[在建立叢集 AWS Command Line Interface 時使用 提供組態](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps-create-cluster.html#emr-configure-apps-create-cluster-cli)，或在[建立叢集時使用 Java 開發套件提供組態](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps-create-cluster.html#emr-configure-apps-create-cluster-sdk)。

**建立 Delta Lake 叢集**

1. 使用下列內容建立檔案 `configurations.json`：

   ```
   [{"Classification":"delta-defaults",  
   "Properties":{"delta.enabled":"true"}},
   {"Classification":"spark-hive-site",
   "Properties":{"hive.metastore.client.factory.class":"com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"}}]
   ```

1. 使用下列組態建立叢集，並將 **example Amazon S3 bucket path** 和 **subnet ID** 取代為您自己的值。

   ```
   aws emr create-cluster 
       --release-label  emr-6.9.0  
       --applications Name=Spark  
       --configurations file://delta_configurations.json 
       --region us-east-1  
       --name My_Spark_Delta_Cluster  
       --log-uri  s3://amzn-s3-demo-bucket/  
       --instance-type m5.xlarge  
       --instance-count 2   
       --service-role EMR_DefaultRole_V2  
       --ec2-attributes  InstanceProfile=EMR_EC2_DefaultRole,SubnetId=subnet-1234567890abcdef0
   ```

# 考量和限制
<a name="Deltaconsiderations-limitations"></a>
+ 支援 Delta Lake 與 Amazon EMR 6.9.0 版及更高版本搭配使用。您可以在具有 Delta 資料表的 Amazon EMR 叢集上使用 [Apache Spark](https://aws.amazon.com/emr/features/spark/) 3.x。
+ 建議您對 S3 位置路徑使用 s3 URI 結構描述而不是 s3a，以取得最佳效能、安全性和可靠性。如需詳細資訊，請參閱[使用儲存和檔案系統](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-file-systems.html)。
+ 使用 Amazon EMR 7.0 時，不支援 Delta Universal Format (UniForm) 和 convert-to-Iceberg 陳述式。
+ 使用 Amazon EMR 6.9 和 6.10，在您將 Delta Lake 資料表資料儲存在 Amazon S3 中時，資料欄資料會在資料欄重新命名操作後變為 `NULL`。Amazon EMR 6.11 已解決此問題。如需有關實驗性資料欄重新命名操作的詳細資訊，請參閱《Delta Lake 使用者指南》中的[資料欄重新命名操作](https://docs.delta.io/latest/delta-batch.html#rename-columns)。
+ 在北京 (cn-north-1) 區域中搭配 Glue 使用 EMR Delta 時，請將 `hive.s3.endpoint`設定為 `https://s3---cn-north-1.amazonaws.com.rproxy.govskope.us.cn`。
+ 如果您在 Apache Spark 外部的 AWS Glue Data Catalog 中建立資料庫，則資料庫可能會有空白`LOCATION`欄位。由於 Spark 不允許使用空位置屬性建立資料庫，因此如果您在 Amazon EMR 中使用 Spark 於 Glue 資料庫中建立 Delta 資料表，且此資料庫具有空的 `LOCATION` 屬性，您將收到下列錯誤：

  ```
  IllegalArgumentException: Can not create a Path from an empty string
  ```

  若要解決此問題，請在 Data Catalog 中建立資料庫，並為 `LOCATION` 欄位使用有效的非空路徑。如需實作此解決方案的步驟，請參閱《Amazon Athena 使用者指南》**中的[建立資料表時的非法引數例外狀況](https://docs.aws.amazon.com/athena/latest/ug/notebooks-spark-known-issues.html#notebooks-spark-known-issues-illegal-argument-exception)。

# Delta 版本歷史記錄
<a name="Delta-release-history"></a>

下表列出 Amazon EMR 的每個發行版本中包含的 Delta 版本，以及與應用程式一起搭配安裝的元件。如需每個發行版本中的元件版本，請參閱 [Amazon EMR 7.x 發行版本](emr-release-7x.md)、[Amazon EMR 6.x 發行版本](emr-release-6x.md) 或 [Amazon EMR 5.x 發行版本](emr-release-5x.md) 中適用於您發行版本的「元件版本」一節。


**Delta 版本資訊**  

| Amazon EMR 發行標籤 | Delta 版本 | 與 Delta 一起搭配安裝的元件 | 
| --- | --- | --- | 
| emr-7.12.0 | 3.3.2-amzn-1 | Not available. | 
| emr-7.11.0 | 3.3.2-amzn-0 | Not available. | 
| emr-7.10.0 | 3.3.0-amzn-2 | Not available. | 
| emr-7.9.0 | 3.3.0-amzn-1 | Not available. | 
| emr-7.8.0 | 3.3.0-amzn-0 | Not available. | 
| emr-7.7.0 | 3.2.1-amzn-2 | Not available. | 
| emr-7.6.0 | 3.2.1-amzn-1 | Not available. | 
| emr-7.5.0 | 3.2.1-amzn-0 | Not available. | 
| emr-7.4.0 | 3.2.0-amzn-1 | Not available. | 
| emr-7.3.0 | 3.2.0-amzn-0 | Not available. | 
| emr-7.2.0 | 3.1.0 | Not available. | 
| emr-7.1.0 | 3.0.0 | Not available. | 
| emr-7.0.0 | 3.0.0 | Not available. | 
| emr-6.15.0 | 2.4.0 | Not available. | 
| emr-6.14.0 | 2.4.0 | Not available. | 
| emr-6.13.0 | 2.4.0 | Not available. | 
| emr-6.12.0 | 2.4.0 | Not available. | 
| emr-6.11.1 | 2.2.0 | Not available. | 
| emr-6.11.0 | 2.2.0 | Not available. | 
| emr-6.10.1 | 2.2.0 | Not available. | 
| emr-6.10.0 | 2.2.0 | Not available. | 
| emr-6.9.1 | 2.1.0 | Not available. | 
| emr-6.9.0 | 2.1.0 | Not available. | 