

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

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

Delta Lake ist ein Storage-Layer-Framework für Lakehouse-Architekturen, die üblicherweise auf Amazon S3 basieren. Mit Amazon-EMR-Versionen 6.9.0 und höher können Sie [Apache Spark](https://aws.amazon.com/emr/features/spark/) 3.x auf Amazon-EMR-Clustern mit Delta-Lake-Tabellen verwenden. Weitere Informationen zu Lakehouses mit Delta Lake finden Sie unter [https://delta.io/.](https://delta.io/)

In der folgenden Tabelle wird die Version von Amazon EMR, die in der neuesten Version von Amazon-EMR-7.x-Serie enthalten ist, zusammen mit den Komponenten aufgeführt, die Amazon EMR mit Delta installiert.

Informationen zur Version der Komponenten, die in dieser Version mit Delta installiert wurden, finden Sie unter [Komponentenversionen von Version 7.12.0](emr-7120-release.md).


**Delta-Versionsinformationen für emr-7.12.0**  

| Amazon-EMR-Versionsbezeichnung | Delta-Version | Mit Delta installierte Komponenten | 
| --- | --- | --- | 
| emr-7.12.0 | Delta 3.3.2-amzn-1 | Not available. | 

In der folgenden Tabelle wird die Version von Amazon EMR, die in der neuesten Version von Amazon-EMR-6.x-Serie enthalten ist, zusammen mit den Komponenten aufgeführt, die Amazon EMR mit Delta installiert.

Die Version der Komponenten, die mit Delta in dieser Version installiert wurden, finden Sie unter [Komponentenversionen der Version 6.15.0](emr-6150-release.md).


**Delta-Versionsinformationen für emr-6.15.0**  

| Amazon-EMR-Versionsbezeichnung | Delta-Version | Mit Delta installierte Komponenten | 
| --- | --- | --- | 
| emr-6.15.0 | Delta 2.4.0 | Not available. | 

# Einführung in Delta Lake
<a name="Deltaintro"></a>

Delta Lake ist ein Open-Source-Projekt, das bei der Implementierung moderner Data-Lake-Architekturen hilft, die üblicherweise auf Amazon S3 basieren. Delta Lake bietet folgende Funktionen:
+ Atomare, konsistente, isolierte, dauerhafte (ACID) Transaktionen auf Spark. Den Lesern wird während eines Spark-Auftrags eine konsistente Ansicht der Tabelle angezeigt.
+ Skalierbares Handling von Metadaten mit verteilter Verarbeitung durch Spark.
+ Kombiniert Streaming- und Batch-Anwendungsfälle mit derselben Delta-Tabelle.
+ Automatische Durchsetzung von Schemas zur Vermeidung fehlerhafter Datensätze bei der Datenerfassung.
+ Zeitreise mit der Versionsverwaltung von Daten.
+ Unterstützt Zusammenführungs-, Aktualisierungs- und Löschvorgänge für komplexe Anwendungsfälle wie Change Data Capture (CDC), Streaming-Upserts und mehr.

# Einen Cluster verwenden, auf dem Delta Lake installiert ist
<a name="Deltausing-cluster"></a>

**Topics**
+ [Verwenden Sie einen Delta Lake-Cluster mit Flink](Deltacluster-flink.md)
+ [Einen Delta-Lake-Cluster mit Trino verwenden](Deltacluster-trino.md)
+ [Verwenden Sie einen Delta-Lake-Cluster mit Spark](Deltausing-cluster-spark.md)
+ [Verwenden Sie einen Delta Lake-Cluster mit Spark und AWS Glue](Deltacluster-spark-glue.md)

# Verwenden Sie einen Delta Lake-Cluster mit Flink
<a name="Deltacluster-flink"></a>

Mit Amazon-EMR-Version 6.11 und höher können Sie Delta Lake mit Ihrem Flink-Cluster verwenden. In den folgenden Beispielen wird der verwendet AWS CLI , um mit Delta Lake auf einem Amazon EMR Flink-Cluster zu arbeiten.

**Anmerkung**  
Amazon EMR unterstützt die DataStream Flink-API, wenn Sie Delta Lake mit einem Flink-Cluster verwenden.

## Einen Delta-Lake-Cluster erstellen
<a name="Deltacreate-a-delta-cluster"></a>

1. Erstellen Sie eine Datei, `delta_configurations.json`, mit folgendem Inhalt:

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

1. Erstellen Sie einen Cluster mit der folgenden Konfiguration. Ersetzen Sie `example Amazon S3 bucket path` und `subnet ID` durch Ihre eigenen Werte.

   ```
   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
   ```

## Eine Flink-Yarn-Sitzung installieren
<a name="Deltainit-flink-yarn"></a>

Um eine Flink-Yarn-Sitzung zu initialisieren, führen Sie den folgenden Befehl aus:

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

## Einen Flink-Auftrag mit Delta Lake erstellen
<a name="Deltabuild-flink-with-delta-lake"></a>

Die folgenden Beispiele zeigen, wie Sie mit SBT oder Maven für die Erstellung Ihres Flink-Auftrags mit Delta Lake verwenden.

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

[sbt](https://www.scala-sbt.org/1.x/docs/index.html) ist ein Build-Tool für Scala, das Sie mit wenig bis gar keiner Konfiguration verwenden können, wenn Sie kleine Projekte haben. 

```
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) ist ein Open-Source-Tool zur Build-Automatisierung von der Apache Software Foundation. Mit Maven können Sie einen Flink-Auftrag mit Delta Lake auf Amazon EMR erstellen, veröffentlichen und bereitstellen.

```
<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>
```

------

## Mit der Flink-Datastream-API in eine Delta-Tabelle schreiben
<a name="Deltawrite-delta-table-with-flink-datastream-api"></a>

Verwenden Sie das folgende Beispiel, um eine DeltaSink zu erstellen, mit der Sie in die Tabelle schreiben können `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;
}
```

## Mit der Flink-Datastream-API aus einer Delta-Tabelle lesen
<a name="Deltaread-delta-table-with-flink-datastream-api"></a>

Verwenden Sie das folgende Beispiel, um eine Grenze zu erstellen DeltaSource , die aus der Tabelle mit einem gelesen werden soll `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");
}
```

## Sink-Erstellung mit Multi-Cluster-Unterstützung für Delta Lake Standalone
<a name="Deltasink-creation-with-multi-cluster"></a>

Verwenden Sie das folgende Beispiel, um eine Tabelle DeltaSink zum Schreiben in eine Tabelle mit A `deltaTablePath` - und [Multi-Cluster-Unterstützung](https://docs.delta.io/latest/delta-standalone.html#multi-cluster-setup) zu erstellen:

```
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;
}
```

## Den Flink-Auftrag ausführen
<a name="Deltarun-flink-job"></a>

Den folgenden Befehl verwenden, um Ihren Job auszuführen:

```
flink run FlinkJob.jar
```

# Einen Delta-Lake-Cluster mit Trino verwenden
<a name="Deltacluster-trino"></a>

Mit Amazon-EMR-Versionen 6.9.0 und höher können Sie Delta Lake mit Ihrem Trino-Cluster verwenden.

In diesem Tutorial werden wir den Trino-Cluster verwenden AWS CLI , um mit Delta Lake auf Amazon EMR zu arbeiten.

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

**Einen Delta-Lake-Cluster erstellen**

1. Erstellen Sie eine Datei, `delta_configurations.json`, und legen Sie Werte für den ausgewählten Katalog fest. Wenn Sie beispielsweise den Hive-Metastore als Ihren Katalog verwenden möchten, sollte Ihre Datei den folgenden Inhalt haben:

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

   Wenn Sie den AWS Glue-Katalog als Ihren Shop verwenden möchten, sollte Ihre Datei den folgenden Inhalt haben:

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

1. Erstellen Sie einen Cluster mit der folgenden Konfiguration und ersetzen Sie **example Amazon S3 bucket path** und **subnet ID** durch Ihre eigenen.

   ```
   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
   ```

## Initialisieren Sie die Trino-Sitzung für Delta Lake
<a name="Deltainitialize-trino"></a>

Um die Trino-Sitzung zu initialisieren, führen Sie den folgenden Befehl aus

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

## In eine Delta-Lake-Tabelle schreiben
<a name="Deltatrino-write-table"></a>

Erstellen Sie Ihre Tabelle mit den folgenden SQL-Befehlen und schreiben Sie in sie:

```
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');
```

## Von einer Delta-Lake-Tabelle lesen
<a name="Deltatrino-read-table"></a>

Lesen Sie mit dem folgenden SQL-Befehl aus Ihrer Tabelle:

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

# Verwenden Sie einen Delta-Lake-Cluster mit Spark
<a name="Deltausing-cluster-spark"></a>

Ab Amazon-EMR-Version 6.9.0 können Sie Delta Lake mit Ihrem Spark-Cluster verwenden, ohne dass Bootstrap-Aktionen erforderlich sind. Für Amazon-EMR-Versionen 6.8.0 und niedriger können Sie Bootstrap-Aktionen verwenden, um die erforderlichen Abhängigkeiten vorab zu installieren. 

In den folgenden Beispielen wird der verwendet AWS CLI , um mit Delta Lake auf einem Amazon EMR Spark-Cluster zu arbeiten. 

Um Delta Lake auf Amazon EMR mit dem zu verwenden AWS Command Line Interface, erstellen Sie zunächst einen Cluster. Informationen zur Angabe der Delta Lake-Klassifizierung mit finden Sie unter [Bereitstellen einer Konfiguration mithilfe von AWS Command Line Interface, AWS Command Line Interface wenn Sie einen Cluster erstellen oder Bereitstellen](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps-create-cluster.html#emr-configure-apps-create-cluster-cli) [einer Konfiguration mit dem Java SDK, wenn Sie einen Cluster erstellen](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps-create-cluster.html#emr-configure-apps-create-cluster-sdk).

1. Erstellen Sie eine Datei, `configurations.json`, mit folgendem Inhalt:

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

1. Erstellen Sie einen Cluster mit der folgenden Konfiguration und ersetzen Sie die Beispiele **bucket path** und **subnet ID** in Amazon S3 durch Ihre eigenen.

   ```
   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
   ```

   Alternativ können Sie einen Amazon-EMR-Cluster und eine Spark-Anwendung mit den folgenden Dateien als JAR-Abhängigkeiten in einem Spark-Job erstellen:

   ```
   /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
   ```
**Anmerkung**  
Wenn Sie Amazon EMR-Versionen 7.0.0 oder höher verwenden, verwenden Sie `/usr/share/aws/delta/lib/delta-spark.jar` anstelle von. `/usr/share/aws/delta/lib/delta-core.jar`

   Weitere Informationen finden Sie unter [Anwendungen einreichen](https://spark.apache.org/docs/latest/submitting-applications.html#submitting-applications).

   Um eine JAR-Abhängigkeit in den Spark-Auftrag aufzunehmen, können Sie der Spark-Anwendung die folgenden Konfigurationseigenschaften hinzufügen:

   ```
   --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"
   ```

   Weitere Informationen zu den Abhängigkeiten von Spark-Aufträgen erhalten Sie unter [Abhängigkeitsmanagement](https://spark.apache.org/docs/latest/running-on-kubernetes.html#dependency-management).

   Wenn Sie Amazon EMR-Versionen 7.0.0 oder höher verwenden, fügen Sie stattdessen die `/usr/share/aws/delta/lib/delta-spark.jar` Konfiguration hinzu.

   ```
   --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"
   ```

## Eine Spark-Sitzung für Delta Lake initialisieren
<a name="Deltainitialize-spark-session"></a>

Die folgenden Beispiele zeigen, wie Sie die interaktive Spark-Shell starten, Spark Submit verwenden oder Amazon EMR Notebooks verwenden, um mit Delta Lake auf Amazon EMR zu arbeiten.

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

1. Verbinden Sie sich dem Primärknoten über SSH. Weitere Informationen finden Sie unter [Stellen Sie über SSH eine Verbindung zum Primärknoten her](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html) im *Verwaltungshandbuch für Amazon EMR*.

1. Geben Sie den folgenden Befehl ein, um die Spark-Shell zu starten. Um die PySpark Shell zu verwenden, ersetzen Sie durch`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"
   ```

   Wenn Sie Amazon EMR-Versionen 6.15.0 oder höher ausführen, müssen Sie außerdem die folgenden Konfigurationen verwenden, um eine differenzierte Zugriffskontrolle auf Basis von Lake Formation mit Delta Lake zu verwenden.

   ```
   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. Verbinden Sie sich dem Primärknoten über SSH. Weitere Informationen finden Sie unter [Stellen Sie über SSH eine Verbindung zum Primärknoten her](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html) im *Verwaltungshandbuch für Amazon EMR*.

1. Geben Sie den folgenden Befehl ein, um die Spark-Sitzung für Delta Lake zu starten.

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

   Wenn Sie Amazon EMR-Versionen 6.15.0 oder höher ausführen, müssen Sie außerdem die folgenden Konfigurationen verwenden, um eine differenzierte Zugriffskontrolle auf Basis von Lake Formation mit Delta Lake zu verwenden.

   ```
   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 ]

Um eine Spark-Sitzung mit Amazon-EMR-Studio-Notebooks zu initialisieren, konfigurieren Sie Ihre Spark-Sitzung mithilfe des **%%configure** magischen Befehls in Ihrem Amazon EMR Notebook, wie im folgenden Beispiel. Weitere Informationen finden Sie unter [Verwendung von EMR-Notebooks-Magics](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-magics.html#emr-magics) im *Verwaltungshandbuch für Amazon EMR*.

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

Wenn Sie Amazon EMR-Versionen 6.15.0 oder höher ausführen, müssen Sie außerdem die folgenden Konfigurationen verwenden, um eine differenzierte Zugriffskontrolle auf Basis von Lake Formation mit Delta Lake zu verwenden.

```
%%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"
  }
}
```

------

## In eine Delta-Lake-Tabelle schreiben
<a name="Deltawrite-to-table"></a>

Das folgende Beispiel zeigt, wie Sie einen Delta Lake-Datensatz erstellen DataFrame und ihn als Delta Lake-Datensatz schreiben. Das Beispiel zeigt, wie Sie mit Datensätzen mit der Spark-Shell arbeiten, während Sie mit dem Primärknoten verbunden sind und SSH als Standard-Hadoop-Benutzer verwenden. 

**Anmerkung**  
Um Codebeispiele in die Spark-Shell einzufügen, geben Sie an der Eingabeaufforderung :paste ein, fügen das Beispiel ein und drücken dann CTRL \$1 D.

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

Spark umfasst auch eine auf Python basierende Shell, `pyspark`, mit der Sie Prototypen von in Python geschriebenen Spark-Programmen entwickeln können. Rufen Sie genau wie bei `spark-shell`, `pyspark` auf dem Primärknoten auf.

```
## 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");
```

------

## Von einer Delta-Lake-Tabelle lesen
<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;
```

------

# Verwenden Sie einen Delta Lake-Cluster mit Spark und AWS Glue
<a name="Deltacluster-spark-glue"></a>

Um den AWS Glue-Katalog als Metastore für Delta Lake-Tabellen zu verwenden, erstellen Sie einen Cluster mit den folgenden Schritten. Informationen zur Angabe der Delta Lake-Klassifizierung mithilfe von finden Sie unter [Bereitstellen einer Konfiguration mithilfe von AWS Command Line Interface, AWS Command Line Interface wenn Sie einen Cluster erstellen](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps-create-cluster.html#emr-configure-apps-create-cluster-cli) oder [Bereitstellen einer Konfiguration mithilfe des Java SDK, wenn Sie einen Cluster erstellen](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps-create-cluster.html#emr-configure-apps-create-cluster-sdk).

**Einen Delta-Lake-Cluster erstellen**

1. Erstellen Sie eine Datei, `configurations.json`, mit folgendem Inhalt:

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

1. Erstellen Sie einen Cluster mit der folgenden Konfiguration und ersetzen Sie **example Amazon S3 bucket path** und **subnet ID** durch Ihre eigenen.

   ```
   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
   ```

# Überlegungen und Einschränkungen
<a name="Deltaconsiderations-limitations"></a>
+ Delta Lake wird für die Verwendung mit Amazon-EMR-Versionen 6.9.0 und höher unterstützt. Sie können [Apache Spark](https://aws.amazon.com/emr/features/spark/) 3.x auf Amazon-EMR-Clustern mit Delta-Tabellen verwenden.
+ Wir empfehlen, das S3-URI-Schema für S3-Standortpfade anstelle von s3a zu verwenden, um optimale Leistung, Sicherheit und Zuverlässigkeit zu erzielen. Weitere Informationen finden Sie unter [Arbeiten mit Speicher- und Dateisystemen](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-file-systems.html).
+ Mit Amazon EMR 7.0 werden Delta Universal Format (UniForm) convert-to-Iceberg Kontoauszüge nicht unterstützt.
+ Wenn Sie mit Amazon EMR 6.9 und 6.10 Delta-Lake-Tabellendaten in Amazon S3 speichern, werden die Spaltendaten `NULL` nach dem Umbenennungsvorgang der Spalten. Ab Amazon EMR 6.11 ist dieses Problem behoben. Weitere Informationen zum experimentellen Vorgang zum Umbenennen von Spalten finden Sie unter [Vorgang zum Umbenennen von Spalten](https://docs.delta.io/latest/delta-batch.html#rename-columns) im Delta-Lake-Benutzerhandbuch.
+ Wenn Sie EMR Delta mit Glue in der Region Peking (cn-north-1) verwenden, stellen Sie auf ein. `hive.s3.endpoint` `https://s3---cn-north-1.amazonaws.com.rproxy.govskope.us.cn`
+ Wenn Sie außerhalb von Apache Spark eine Datenbank im AWS Glue-Datenkatalog erstellen, könnte die Datenbank ein leeres `LOCATION` Feld enthalten. Da Spark das Erstellen von Datenbanken mit einer leeren Standorteigenschaft nicht zulässt, erhalten Sie die folgende Fehlermeldung, wenn Sie Spark in Amazon EMR verwenden, um eine Delta-Tabelle in einer Glue-Datenbank zu erstellen und die Datenbank eine leere `LOCATION`-Eigenschaft hat:

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

  Um dieses Problem zu beheben, erstellen Sie die Datenbank im Datenkatalog mit einem gültigen, nicht leeren Pfad für das `LOCATION`-Feld. Schritte zur Implementierung dieser Lösung finden Sie unter [Unzulässige Argumentausnahme beim Erstellen einer Tabelle](https://docs.aws.amazon.com/athena/latest/ug/notebooks-spark-known-issues.html#notebooks-spark-known-issues-illegal-argument-exception) im *Amazon-Athena-Benutzerhandbuch*.

# Versionsverlauf von Delta
<a name="Delta-release-history"></a>

In der folgenden Tabelle sind die Version von Delta aufgeführt, die in jeder Release-Version von Amazon EMR enthalten ist, zusammen mit den Komponenten, die mit der Anwendung installiert wurden. Informationen zu den Komponentenversionen in den einzelnen Versionen finden Sie im Abschnitt Komponentenversion für Ihre Version in [Amazon-EMR-7.x-Versionen](emr-release-7x.md), [Amazon-EMR-6.x-Versionen](emr-release-6x.md) oder [Amazon-EMR-5.x-Versionen](emr-release-5x.md).


**Die Delta Versionsinformationen**  

| Amazon-EMR-Versionsbezeichnung | Delta-Version | Mit Delta installierte Komponenten | 
| --- | --- | --- | 
| 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. | 