

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.

# Hudi
<a name="emr-hudi"></a>

[Apache Hudi](https://hudi.apache.org/) ist ein Open-Source-Datenverwaltungs-Framework, das verwendet wird, um die inkrementelle Datenverarbeitung und die Entwicklung von Datenpipelines zu vereinfachen, indem Einfüge-, Aktualisierungs-, Upsert- und Löschfunktionen auf Datensatzebene bereitgestellt werden. *Upsert* bezieht sich auf die Möglichkeit, Datensätze in ein vorhandenes Dataset einzufügen, wenn sie noch nicht vorhanden sind, oder sie zu aktualisieren, falls sie schon vorhanden sind. Durch die effiziente Verwaltung der Datenaufstellung in Amazon S3 ermöglicht Hudi die Aufnahme und Aktualisierung von Daten in nahezu Echtzeit. Hudi verwaltet sorgfältig Metadaten der Aktionen, die für das Dataset ausgeführt werden, um leichter sicherzustellen zu können, dass die Aktionen atomar und konsistent sind.

Hudi ist in [Apache Spark](https://aws.amazon.com/emr/features/spark/), [Apache Hive](https://hive.apache.org/) und [Presto](https://prestodb.github.io) integriert. In den Amazon-EMR-Release-Versionen 6.1.0 und höher ist Hudi auch in [Trino (PrestoSQL)](https://trino.io/) integriert. 

Ab Amazon-EMR-Version 5.28.0 und höher installiert EMR Hudi-Komponenten standardmäßig, wenn Spark, Hive Presto oder Flink installiert ist. Sie können Spark oder das DeltaStreamer Hudi-Hilfsprogramm verwenden, um Hudi-Datensätze zu erstellen oder zu aktualisieren. Sie können Hive, Spark, Presto oder Flink verwenden, um ein Hudi-Datensatz interaktiv abzufragen oder Datenverarbeitungspipelines mithilfe des *inkrementellen Pull-Vorgangs * zu erstellen. Inkrementeller Pull-Vorgang bezieht sich auf die Fähigkeit, nur die Daten zu extrahieren, die sich zwischen zwei Aktionen geändert haben.

Aufgrund dieser Features eignet sich Hudi für die folgenden Anwendungsfälle:
+ Arbeiten mit Streaming-Daten von Sensoren und anderen IoT-Geräten (Internet of Things), die bestimmte Dateneinfüge- und Aktualisierungsereignisse erfordern.
+ Einhaltung der Datenschutzvorschriften in Anwendungen, in denen Benutzer möglicherweise vergessen werden möchten oder ihre Einwilligung für die Verwendung ihrer Daten ändern möchten.
+ Implementierung eines [CDC-Systems (Change Data Capture)](https://en.wikipedia.org/wiki/Change_data_capture), mit dem Sie Änderungen relativ zur Zeit auf ein Dataset anwenden können.

Die folgende Tabelle listet die Version von Hudi auf, die in der neuesten Version der Amazon-EMR-7.x-Serie enthalten ist, zusammen mit den Komponenten, die Amazon EMR mit Hudi installiert.

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


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

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

Die folgende Tabelle listet die Version von Hudi auf, die in der neuesten Version der Amazon-EMR-6.x-Serie enthalten ist, zusammen mit den Komponenten, die Amazon EMR mit Hudi installiert.

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


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

| Amazon-EMR-Versionsbezeichnung | Hudi-Version | Mit Hudi installierte Komponenten | 
| --- | --- | --- | 
| emr-6.15.0 | Hudi 0.14.0-amzn-0 | Not available. | 

**Anmerkung**  
Amazon-EMR-Version 6.8.0 enthält [Apache Hudi](https://hudi.apache.org/) 0.11.1. Amazon-EMR-6.8.0-Cluster sind jedoch auch mit der Open-Source-Version von Hudi 0.12.0 kompatibel. `hudi-spark3.3-bundle_2.12`

Die folgende Tabelle listet die Version von Hudi auf, die in der neuesten Version der Amazon-EMR-5.x-Serie enthalten ist, zusammen mit den Komponenten, die Amazon EMR mit Hudi installiert.

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


**Hudi-Versionsinformationen für emr-5.36.2**  

| Amazon-EMR-Versionsbezeichnung | Hudi-Version | Mit Hudi installierte Komponenten | 
| --- | --- | --- | 
| emr-5.36.2 | Hudi 0.10.1-amzn-1 | Not available. | 

**Topics**
+ [

# Funktionsweise von Hudi
](emr-hudi-how-it-works.md)
+ [

# Überlegungen und Einschränkungen für die Verwendung von Hudi in Amazon EMR
](emr-hudi-considerations.md)
+ [

# Erstellen eines Cluster mit installierter Hudi-Anwendung
](emr-hudi-installation-and-configuration.md)
+ [

# Arbeiten mit einem Hudi-Datensatz
](emr-hudi-work-with-dataset.md)
+ [

# Die Hudi-CLI verwenden
](emr-hudi-cli.md)
+ [

# Hudi-Versionsverlauf
](Hudi-release-history.md)

# Funktionsweise von Hudi
<a name="emr-hudi-how-it-works"></a>

Wenn Sie Hudi mit Amazon EMR verwenden, können Sie mit der Spark-Datenquellen-API oder dem DeltaStreamer Hudi-Hilfsprogramm Daten in den Datensatz schreiben. Hudi organisiert einen Datensatz in einer partitionierten Verzeichnisstruktur unter einer `basepath`, die einer herkömmlichen Hive-Tabelle ähnelt. Die Besonderheiten, wie die Daten in diesen Verzeichnissen als Dateien angelegt werden, hängen von dem von Ihnen ausgewählten Dataset-Typ ab. Sie können entweder Copy on Write (CoW, Kopieren beim Schreiben) oder Merge on Read (MoR, Beim Lesen zusammenführen) wählen.

Unabhängig vom Dataset-Typ wird jede Partition in einem Dataset eindeutig durch ihren `partitionpath` relativ zum `basepath` identifiziert. Innerhalb jeder Partition werden Datensätze in mehrere Datendateien verteilt. Weitere Informationen finden Sie unter [Dateimanagement](https://hudi.apache.org/docs/concepts.html#file-management) in der Apache Hudi-Dokumentation.

Jede Aktion in Hudi hat einen entsprechenden Commit, der durch einen monoton ansteigenden Zeitstempel gekennzeichnet ist, der als *Instant* bezeichnet wird. Hudi speichert eine Reihe aller am Datensatz ausgeführten Aktionen als Zeitleiste. Hudi nutzt die Timeline, um eine Snapshot-Isolation zwischen Lesern und Autoren zu ermöglichen und einen Rollback zu einem früheren Zeitpunkt zu ermöglichen. Weitere Informationen zu den von Hudi aufgezeichneten Aktionen und dem Status der Aktionen finden Sie unter [Timeline](https://hudi.apache.org/docs/concepts.html#timeline) in der Apache-Hudi-Dokumentation.

## Grundlegendes zu den Speichertypen von Datensätzen: „Beim Schreiben kopieren“ gegenüber „beim Lesen zusammenführen“
<a name="emr-hudi-data-files"></a>

Wenn Sie ein Hudi-Datensatz erstellen, geben Sie an, dass das Datensatz entweder beim Schreiben kopiert oder beim Lesen zusammengeführt werden soll.
+ **Copy on Write (CoW, Beim Schreiben kopieren)** – Daten werden in einem spaltenbasierten Format (Parquet) gespeichert, und jedes Update erstellt während eines Schreibvorgangs eine neue Version von Dateien. CoW ist der Standardspeichertyp. 
+ **Merge on Read (MoR, Beim Lesen zusammenführen)** – Daten werden mit einer Kombination aus spalten- (Parquet) und zeilenbasierten (Avro) Formaten gespeichert. Updates werden in zeilenbasierten *Delta*-Dateien protokolliert und nach Bedarf komprimiert, um neue Versionen der Spaltendateien zu erstellen.

Bei CoW-Datasets wird jedes Mal, wenn ein Datensatz aktualisiert wird, die Datei, die den Datensatz enthält, mit den aktualisierten Werten neu geschrieben. Bei einem MoR-Datensatz schreibt Hudi jedes Mal, wenn es eine Aktualisierung gibt, nur die Zeile für den geänderten Datensatz. MoR eignet sich besser für schreib- oder änderungsintensive Workloads mit weniger Lesevorgängen. CoW eignet sich besser für leseintensive Workloads für Daten, die sich seltener ändern.

Hudi bietet drei logische Ansichten für den Zugriff auf die Daten:
+ **Lese-optimierte Ansicht** – Stellt den neuesten festgeschriebenen Datensatz aus CoW-Tabellen und den neuesten komprimierten Datensatz aus MoR-Tabellen bereit.
+ **Inkrementelle Ansicht** – Stellt einen Änderungsstream zwischen zwei Aktionen aus einem CoW-Datensatz bereit, um nachgeschaltete Aufträge zu versorgen und Workflows zu extrahieren, transformieren, laden (ETL).
+ **Echtzeitansicht** – Stellt die neuesten festgeschriebenen Daten aus einer MoR-Tabelle bereit, indem die spalten- und zeilenbasierten Dateien inline zusammengeführt werden.

Wenn Sie die leseoptimierte Ansicht abfragen, gibt die Abfrage alle komprimierten Daten zurück, enthält jedoch nicht die neuesten Delta-Commits. Das Abfragen dieser Daten bietet eine gute Leseleistung, aber die neuesten Daten werden nicht mehr angezeigt. Wenn Sie die Echtzeitansicht abfragen, führt Hudi die komprimierten Daten beim Lesen mit den Delta-Commits zusammen. Die neuesten Daten stehen für die Abfrage zur Verfügung, aber der Rechenaufwand für die Zusammenführung macht die Abfrage weniger performant. Die Möglichkeit, komprimierte Daten oder Echtzeitdaten abzufragen, ermöglicht es Ihnen, bei der Abfrage zwischen Leistung und Flexibilität zu wählen.

Weitere Informationen zu den Kompromissen zwischen Speichertypen finden Sie unter [Speichertypen und Ansichten](https://hudi.apache.org/docs/concepts.html#storage-types--views) in der Apache-Hudi-Dokumentation.

Hudi erstellt zwei Tabellen im Hive-Metastore für MoR: eine Tabelle mit dem von Ihnen angegebenen Namen, bei der es sich um eine leseoptimierte Ansicht handelt, und eine Tabelle mit demselben Namen, an den `_rt` angehängt wird, bei der es sich um eine Echtzeitansicht handelt. Sie können beide Tabellen abfragen.

## Registrieren eines Hudi-Datensatzes bei Ihrem Metastore
<a name="emr-hudi-hive-metastore"></a>

Wenn Sie eine Hudi-Tabelle mit dem Hive-Metastore registrieren, können Sie Hudi-Tabellen wie jede andere Tabelle mit Hive, Spark SQL oder Presto abfragen. Darüber hinaus können Sie Hudi in AWS Glue integrieren, indem Sie Hive und Spark so konfigurieren, dass sie den AWS Glue-Datenkatalog als Metastore verwenden. Hudi registriert für MoR-Tabellen den Datensatz als zwei Tabellen im Metastore: eine Tabelle mit dem von Ihnen angegebenen Namen, bei der es sich um eine leseoptimierte Ansicht handelt, und eine Tabelle mit demselben Namen, an die `_rt` angehängt wird, bei dem es sich um eine Echtzeitansicht handelt.

Sie registrieren eine Hudi-Tabelle mit dem Hive-Metastore, wenn Sie mit Spark ein Hudi-Datensatz erstellen, indem Sie die Option `HIVE_SYNC_ENABLED_OPT_KEY` auf `"true"` einstellen und andere erforderliche Eigenschaften bereitstellen. Weitere Informationen finden Sie unter [Arbeiten mit einem Hudi-Datensatz](emr-hudi-work-with-dataset.md). Darüber hinaus können Sie das Befehlszeilenprogramm hive\$1sync\$1tool verwenden, um einen Hudi-Datensatz separat als Tabelle in Ihrem Metastore zu registrieren. 

# Überlegungen und Einschränkungen für die Verwendung von Hudi in Amazon EMR
<a name="emr-hudi-considerations"></a>
+ **Datensatzschlüsselfeld darf nicht null oder leer sein** – Das Feld, das Sie als Datensatzschlüsselfeld angeben, darf weder `null`-Werte noch leere Werte aufweisen.
+ **Das Schema wird standardmäßig beim Upsert und Insert aktualisiert** — Hudi bietet eine Schnittstelle, die festlegt, wie `HoodieRecordPayload` die Eingabe DataFrame und der vorhandene Hudi-Datensatz zusammengeführt werden, um einen neuen, aktualisierten Datensatz zu erzeugen. Hudi bietet eine Standardimplementierung dieser Klasse`OverwriteWithLatestAvroPayload`, die bestehende Datensätze überschreibt und das in der Eingabe angegebene Schema aktualisiert. DataFrame Um diese Logik für die Implementierung von Merge- und Teilaktualisierungen anzupassen, können Sie mithilfe des Parameters `DataSourceWriteOptions.PAYLOAD_CLASS_OPT_KEY` eine Implementierung der `HoodieRecordPayload`-Schnittstelle bereitstellen.
+ **Löschen erfordert Schema** – Beim Löschen müssen Sie den Datensatzschlüssel, den Partitionsschlüssel und die Schlüsselfelder für die Vorab-Kombination angeben. Andere Spalten können auf `null` gesetzt werden oder leer sein, aber das vollständige Schema ist erforderlich.
+ **Einschränkungen bei MoR-Tabellen** – MoR-Tabellen unterstützen kein Savepointing. Sie können MoR-Tabellen mit der leseoptimierten Ansicht oder der Echtzeitansicht (`tableName_rt`) von Spark SQL, Presto oder Hive abfragen. Wenn Sie die leseoptimierte Ansicht verwenden, werden nur Basisdateidaten und keine zusammengeführte Ansicht von Basis- und Protokolldaten angezeigt.
+ **Hive**
  + Für die Registrierung von Tabellen im Hive-Metastore erwartet , dass der Hive Thrift-Server am Standardport `10000` ausgeführt wird. Wenn Sie diesen Port mit einem benutzerdefinierten Port überschreiben, übergeben Sie die Option `HIVE_URL_OPT_KEY` wie im folgenden Beispiel gezeigt.

    ```
    .option(DataSourceWriteOptions.HIVE_URL_OPT_KEY, "jdbc:hive2://localhost:override-port-number
    ```
  + Der Datentyp `timestamp` in Spark ist in Hive als `long`-Datentyp und nicht als Hive-Typ `timestamp` registriert.
+ **Presto**
  + Presto unterstützt nicht das Lesen von MoR-Echtzeittabellen.Funktionen in Hudi-Versionen unter 0.6.0. 
  + Presto unterstützt nur Snapshot-Abfragen.
  + Damit Presto Hudi-Datensatz-Spalten korrekt interpretiert, stellen Sie den `hive.parquet_use_column_names`-Wert auf `true` ein.
    + Um den Wert für eine Sitzung festzulegen, führen Sie in der Presto-Shell den folgenden Befehl aus:

      ```
      set session hive.parquet_use_column_names=true
      ```
    + Um den Wert auf Clusterebene festzulegen, verwenden Sie die Konfigurationsklassifizierung `presto-connector-hive`, um `hive.parquet.use_column_names` auf `true` einzustellen, wie im folgenden Beispiel veranschaulicht. Weitere Informationen finden Sie unter [Anwendungen konfigurieren](emr-configure-apps.md).

      ```
      [
        {
          "Classification": "presto-connector-hive",
          "Properties": {
            "hive.parquet.use-column-names": "true"
          }
        }
      ]
      ```
+ **HBase Index**
  + Die HBase Version, die zum *Erstellen* von Hudi verwendet wurde, unterscheidet sich möglicherweise von der Version, die im EMR Release Guide aufgeführt ist. Um die richtigen Abhängigkeiten für Ihre Spark-Sitzung abzurufen, führen Sie den folgenden Befehl aus.

    ```
    spark-shell \
    --jars /usr/lib/spark/external/lib/spark-avro.jar,/usr/lib/hudi/cli/lib/*.jar \
    --conf "spark.serializer=org.apache.spark.serializer.KryoSerializer" \
    --conf "spark.sql.hive.convertMetastoreParquet=false"
    ```
+ **Einstellungen für beste Leistung** — Für EMR 7.3\$1/Hudi 0.15\$1 wird Kunden empfohlen, diese Konfiguration festzulegen, um den Aufwand für die Kryo-Serialisierung zu reduzieren: 

  ```
  --conf 'spark.kryo.registrator=org.apache.spark.HoodieKryoRegistrar'
  ```
**Anmerkung**  
Wenn Sie Fine-Grained Access Control (FGAC) auf EMR Serverless verwenden, ist diese Konfiguration nicht erforderlich, da Benutzer stattdessen als verwenden müssen. JavaSerializer KryoSerializer

# Erstellen eines Cluster mit installierter Hudi-Anwendung
<a name="emr-hudi-installation-and-configuration"></a>

Ab der Amazon-EMR-Version 5.28.0 installiert Amazon EMR standardmäßig Hudi-Komponenten, wenn Spark, Hive oder Presto installiert wird. Um Hudi in Amazon EMR zu verwenden, erstellen Sie einen Cluster mit den folgenden installierten Anwendungen:
+ Hadoop
+ Hive
+ Spark
+ Presto
+ Flink

Sie können einen Cluster mithilfe der AWS-Managementkonsole AWS CLI, der oder der Amazon EMR-API erstellen.

## Um einen Cluster mit Hudi zu erstellen, verwenden Sie AWS-Managementkonsole
<a name="emr-hudi-create-cluster-console"></a>

1. Navigieren Sie zur neuen Amazon-EMR-Konsole und wählen Sie in der Seitennavigation die Option **Zur alten Konsole wechseln** aus. Weitere Informationen darüber, was Sie erwartet, wenn Sie zur alten Konsole wechseln, finden Sie unter [Verwenden der alten Konsole](https://docs.aws.amazon.com/emr/latest/ManagementGuide/whats-new-in-console.html#console-opt-in).

1. Wählen Sie **Create Cluster (Cluster erstellen)** und **Go to advanced options (Zu erweiterten Optionen)** aus.

1. Wählen Sie unter „Software Configuration (Softwarekonfiguration)“ **emr-5.28.0** oder höher für **Release** aus und wählen Sie **Hadoop**, **Hive**, **Spark**, **Presto** und **Tez** zusammen mit anderen Anwendungen aus, die Ihr Cluster benötigt.

1. Konfigurieren Sie nach Bedarf andere Optionen für Ihre Anwendung und wählen Sie dann **Next (Weiter)**.

1. Konfigurieren Sie die Optionen für **Hardware** und **General cluster settings (Allgemeine Clustereinstellungen)** ganz nach Wunsch.

1. Für **Security Options (Sicherheitsoptionen)** empfehlen wir, ein **EC2 key pair (EC2-Schlüsselpaar)** auszuwählen, mit dem Sie mithilfe von SSH eine Verbindung mit der Befehlszeile des Master-Knotens herstellen können. Auf diese Weise können Sie die in diesem Handbuch beschriebenen Spark-Shell-Befehle, Hive-CLI-Befehle und Hudi-CLI-Befehle ausführen.

1. Wählen Sie weitere Sicherheitsoptionen wie gewünscht und wählen Sie anschließend **Create cluster (Cluster erstellen)** aus.

# Arbeiten mit einem Hudi-Datensatz
<a name="emr-hudi-work-with-dataset"></a>

Hudi unterstützt das Einfügen, Aktualisieren und Löschen von Daten in Hudi-Datensätzen über Spark. Weitere Informationen finden Sie unter [Hudi-Tabellen schreiben](https://hudi.apache.org/docs/writing_data.html) in der Apache-Hudi-Dokumentation.

In den folgenden Beispielen wird veranschaulicht, wie Sie die interaktive Spark-Shell starten und die Spark-Übermittlung und Amazon EMR Notebooks verwenden, um mit Hudi in Amazon EMR zu arbeiten. Sie können auch das DeltaStreamer Hudi-Hilfsprogramm oder andere Tools verwenden, um in einen Datensatz zu schreiben. Die Beispiele in diesem Abschnitt veranschaulichen das Arbeiten mit Datasets unter Verwendung der Spark-Shell, während eine Verbindung mit dem Master-Knoten mittels SSH als Standard-`hadoop`-Benutzer vorhanden ist.

## Starten Sie die Spark-Shell mit Amazon EMR 6.7 und höher
<a name="hudi-datasets-67"></a>

Wenn Sie `spark-shell`, `spark-submit` oder `spark-sql` mit Amazon EMR 6.7.0 oder höher ausführen, übergeben Sie die folgenden Befehle.

**Anmerkung**  
Amazon EMR 6.7.0 verwendet [Apache Hudi](https://hudi.apache.org/) 0.11.0-amzn-0, das erhebliche Verbesserungen gegenüber früheren Hudi-Versionen enthält. Weitere Informationen finden Sie im [Apache-Hudi-0.11.0-Migrationshandbuch.](https://hudi.apache.org/releases/release-0.11.0/#migration-guide) Die Beispiele auf dieser Registerkarte spiegeln diese Änderungen wider.

**So öffnen Sie die Spark-Shell auf dem Primärknoten**

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 *spark-shell* durch*pyspark*.

   ```
   spark-shell --jars /usr/lib/hudi/hudi-spark-bundle.jar \
   --conf "spark.serializer=org.apache.spark.serializer.KryoSerializer" \    
   --conf "spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog"  \
   --conf "spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension"
   ```

## Starten Sie die Spark-Shell mit Amazon EMR 6.6 und früher
<a name="hudi-datasets-67"></a>

Wenn Sie `spark-shell`, `spark-submit`, oder `spark-sql` mit Amazon EMR 6.6.x oder früher ausführen, übergeben Sie die folgenden Befehle.

**Anmerkung**  
Amazon EMR 6.2 und 5.31 und höher (Hudi 0.6.x und höher) können `spark-avro.jar` in der Konfiguration weglassen.
Amazon EMR 6.5 und 5.35 und höher (Hudi 0.9.x und höher) können `spark.sql.hive.convertMetastoreParquet=false` in der Konfiguration weglassen.
Amazon EMR 6.6 und 5.36 und höher (Hudi 0.10.x und höher) müssen die `HoodieSparkSessionExtension` Konfiguration enthalten, wie sie im [Spark-Leitfaden zu Version](https://hudi.apache.org/docs/0.10.0/quick-start-guide/): 0.10.0 beschrieben ist:   

  ```
  --conf  "spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension" \
  ```

**So öffnen Sie die Spark-Shell auf dem Primärknoten**

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, *spark-shell* ersetzen Sie durch*pyspark*.

   ```
   spark-shell \
   --conf "spark.serializer=org.apache.spark.serializer.KryoSerializer" \
   --conf "spark.sql.hive.convertMetastoreParquet=false" \
   --jars /usr/lib/hudi/hudi-spark-bundle.jar,/usr/lib/spark/external/lib/spark-avro.jar
   ```

## Verwenden Sie Hudi mit Amazon EMR Notebooks, die Amazon EMR 6.7 und höher verwenden
<a name="hudi-datasets-notebooks"></a>

Um Hudi mit Amazon EMR Notebooks verwenden zu können, müssen Sie zuerst die Hudi Jar-Dateien aus dem lokalen Dateisystem auf HDFS auf dem Hauptknoten des Notebook-Clusters kopieren. Anschließend verwenden Sie den Notebook-Editor, um Ihr EMR Notebook für die Verwendung von Hudi zu konfigurieren.

**Wie Sie Hudi mit Amazon EMR Notebooks verwenden**

1. Erstellen und starten Sie einen Cluster für Amazon EMR Notebooks. Weitere Informationen finden Sie unter [Erstellen von Amazon-EMR-Clustern für Notebooks](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-managed-notebooks-cluster.html) im *Verwaltungshandbuch für Amazon EMR*.

1. Verbinden Sie sich über SSH mit dem Master-Knoten des Clusters und kopieren Sie dann die Jar-Dateien aus dem lokalen Dateisystem auf HDFS, wie in den folgenden Beispielen veranschaulicht. In diesem Beispiel erstellen wir ein Verzeichnis in HDFS zur Veranschaulichung der Dateiverwaltung. Sie können Ihr eigenes Ziel in HDFS wählen, falls gewünscht.

   ```
   hdfs dfs -mkdir -p /apps/hudi/lib
   ```

   ```
   hdfs dfs -copyFromLocal /usr/lib/hudi/hudi-spark-bundle.jar /apps/hudi/lib/hudi-spark-bundle.jar
   ```

1. Öffnen Sie den Notebook-Editor, geben Sie den Code aus dem folgenden Beispiel ein und führen Sie ihn aus.

   ```
   %%configure
   { "conf": {
               "spark.jars":"hdfs:///apps/hudi/lib/hudi-spark-bundle.jar",
               "spark.serializer":"org.apache.spark.serializer.KryoSerializer",
               "spark.sql.catalog.spark_catalog": "org.apache.spark.sql.hudi.catalog.HoodieCatalog",
               "spark.sql.extensions":"org.apache.spark.sql.hudi.HoodieSparkSessionExtension"
             }}
   ```

## Verwenden Sie Hudi mit Amazon EMR Notebooks, die Amazon EMR 6.6 und früher verwenden
<a name="hudi-datasets-notebooks-66"></a>

Um Hudi mit Amazon EMR Notebooks verwenden zu können, müssen Sie zuerst die Hudi Jar-Dateien aus dem lokalen Dateisystem auf HDFS auf dem Hauptknoten des Notebook-Clusters kopieren. Anschließend verwenden Sie den Notebook-Editor, um Ihr EMR Notebook für die Verwendung von Hudi zu konfigurieren.

**Wie Sie Hudi mit Amazon EMR Notebooks verwenden**

1. Erstellen und starten Sie einen Cluster für Amazon EMR Notebooks. Weitere Informationen finden Sie unter [Erstellen von Amazon-EMR-Clustern für Notebooks](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-managed-notebooks-cluster.html) im *Verwaltungshandbuch für Amazon EMR*.

1. Verbinden Sie sich über SSH mit dem Master-Knoten des Clusters und kopieren Sie dann die Jar-Dateien aus dem lokalen Dateisystem auf HDFS, wie in den folgenden Beispielen veranschaulicht. In diesem Beispiel erstellen wir ein Verzeichnis in HDFS zur Veranschaulichung der Dateiverwaltung. Sie können Ihr eigenes Ziel in HDFS wählen, falls gewünscht.

   ```
   hdfs dfs -mkdir -p /apps/hudi/lib
   ```

   ```
   hdfs dfs -copyFromLocal /usr/lib/hudi/hudi-spark-bundle.jar /apps/hudi/lib/hudi-spark-bundle.jar
   ```

   ```
   hdfs dfs -copyFromLocal /usr/lib/spark/external/lib/spark-avro.jar /apps/hudi/lib/spark-avro.jar
   ```

1. Öffnen Sie den Notebook-Editor, geben Sie den Code aus dem folgenden Beispiel ein und führen Sie ihn aus.

   ```
   { "conf": {
               "spark.jars":"hdfs:///apps/hudi/lib/hudi-spark-bundle.jar,hdfs:///apps/hudi/lib/spark-avro.jar",
               "spark.serializer":"org.apache.spark.serializer.KryoSerializer",
               "spark.sql.hive.convertMetastoreParquet":"false"
             }}
   ```

## Initialisieren Sie eine Spark-Sitzung für Hudi
<a name="emr-hudi-initialize-session"></a>

Wenn Sie Scala verwenden, müssen Sie die folgenden Klassen in Ihre Spark-Sitzung importieren. Dies muss einmal pro Spark-Sitzung erfolgen.

```
import org.apache.spark.sql.SaveMode
import org.apache.spark.sql.functions._
import org.apache.hudi.DataSourceWriteOptions
import org.apache.hudi.DataSourceReadOptions
import org.apache.hudi.config.HoodieWriteConfig
import org.apache.hudi.hive.MultiPartKeysValueExtractor
import org.apache.hudi.hive.HiveSyncConfig
import org.apache.hudi.sync.common.HoodieSyncConfig
```

## Schreiben Sie in einen Hudi-Datensatz
<a name="emr-hudi-dataframe"></a>

Die folgenden Beispiele zeigen, wie ein Hudi-Datensatz erstellt DataFrame und als Hudi-Datensatz geschrieben wird.

**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**.

Jedes Mal, wenn Sie einen DataFrame in einen Hudi-Datensatz schreiben, müssen Sie Folgendes angeben. `DataSourceWriteOptions` Viele dieser Optionen sind unter den Schreiboperationen wahrscheinlich identisch. Im folgenden Beispiel werden allgemeine Optionen unter Verwendung der Variablen `hudiOptions` angegeben, die von nachfolgenden Beispielen verwendet wird.

### Schreiben Sie mit Scala mit Amazon EMR 6.7 und höher
<a name="scala-examples-67"></a>

**Anmerkung**  
Amazon EMR 6.7.0 verwendet [Apache Hudi](https://hudi.apache.org/) 0.11.0-amzn-0, das erhebliche Verbesserungen gegenüber früheren Hudi-Versionen enthält. Weitere Informationen finden Sie im [Apache-Hudi-0.11.0-Migrationshandbuch.](https://hudi.apache.org/releases/release-0.11.0/#migration-guide) Die Beispiele auf dieser Registerkarte spiegeln diese Änderungen wider.

```
// Create a DataFrame
val inputDF = 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"),
 ("104", "2015-01-02", "2015-01-01T12:15:00.512679Z"),
 ("105", "2015-01-02", "2015-01-01T13:51:42.248818Z")
 ).toDF("id", "creation_date", "last_update_time")

//Specify common DataSourceWriteOptions in the single hudiOptions variable 
val hudiOptions = Map[String,String](
  HoodieWriteConfig.TBL_NAME.key -> "tableName",
  DataSourceWriteOptions.TABLE_TYPE.key -> "COPY_ON_WRITE", 
  DataSourceWriteOptions.RECORDKEY_FIELD_OPT_KEY -> "id",
  DataSourceWriteOptions.PARTITIONPATH_FIELD_OPT_KEY -> "creation_date",
  DataSourceWriteOptions.PRECOMBINE_FIELD_OPT_KEY -> "last_update_time",
  DataSourceWriteOptions.HIVE_SYNC_ENABLED_OPT_KEY -> "true",
  DataSourceWriteOptions.HIVE_TABLE_OPT_KEY -> "tableName",
  DataSourceWriteOptions.HIVE_PARTITION_FIELDS_OPT_KEY -> "creation_date",
  HoodieSyncConfig.META_SYNC_PARTITION_EXTRACTOR_CLASS.key -> "org.apache.hudi.hive.MultiPartKeysValueExtractor",
  HoodieSyncConfig.META_SYNC_ENABLED.key -> "true",
  HiveSyncConfig.HIVE_SYNC_MODE.key -> "hms",
  HoodieSyncConfig.META_SYNC_TABLE_NAME.key -> "tableName",
  HoodieSyncConfig.META_SYNC_PARTITION_FIELDS.key -> "creation_date"
)

// Write the DataFrame as a Hudi dataset
(inputDF.write
    .format("hudi")
    .options(hudiOptions)
    .option(DataSourceWriteOptions.OPERATION_OPT_KEY,"insert")
    .mode(SaveMode.Overwrite)
    .save("s3://amzn-s3-demo-bucket/myhudidataset/"))
```

### Schreiben Sie mit Scala mit Amazon EMR 6.6 und früher
<a name="scala-examples-66"></a>

```
// Create a DataFrame
val inputDF = 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"),
 ("104", "2015-01-02", "2015-01-01T12:15:00.512679Z"),
 ("105", "2015-01-02", "2015-01-01T13:51:42.248818Z")
 ).toDF("id", "creation_date", "last_update_time")

//Specify common DataSourceWriteOptions in the single hudiOptions variable 
val hudiOptions = Map[String,String](
  HoodieWriteConfig.TABLE_NAME -> "tableName",
  DataSourceWriteOptions.TABLE_TYPE_OPT_KEY -> "COPY_ON_WRITE", 
  DataSourceWriteOptions.RECORDKEY_FIELD_OPT_KEY -> "id",
  DataSourceWriteOptions.PARTITIONPATH_FIELD_OPT_KEY -> "creation_date",
  DataSourceWriteOptions.PRECOMBINE_FIELD_OPT_KEY -> "last_update_time",
  DataSourceWriteOptions.HIVE_SYNC_ENABLED_OPT_KEY -> "true",
  DataSourceWriteOptions.HIVE_TABLE_OPT_KEY -> "tableName",
  DataSourceWriteOptions.HIVE_PARTITION_FIELDS_OPT_KEY -> "creation_date",
  DataSourceWriteOptions.HIVE_PARTITION_EXTRACTOR_CLASS_OPT_KEY -> classOf[MultiPartKeysValueExtractor].getName
)

// Write the DataFrame as a Hudi dataset
(inputDF.write
    .format("org.apache.hudi")
    .option(DataSourceWriteOptions.OPERATION_OPT_KEY, DataSourceWriteOptions.INSERT_OPERATION_OPT_VAL)
    .options(hudiOptions)
    .mode(SaveMode.Overwrite)
    .save("s3://amzn-s3-demo-bucket/myhudidataset/"))
```

### Schreiben Sie mit PySpark
<a name="pyspark-examples"></a>

```
# Create a DataFrame
inputDF = 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"),
        ("104", "2015-01-02", "2015-01-01T12:15:00.512679Z"),
        ("105", "2015-01-02", "2015-01-01T13:51:42.248818Z"),
    ],
    ["id", "creation_date", "last_update_time"]
)

# Specify common DataSourceWriteOptions in the single hudiOptions variable
hudiOptions = {
'hoodie.table.name': 'tableName',
'hoodie.datasource.write.recordkey.field': 'id',
'hoodie.datasource.write.partitionpath.field': 'creation_date',
'hoodie.datasource.write.precombine.field': 'last_update_time',
'hoodie.datasource.hive_sync.enable': 'true',
'hoodie.datasource.hive_sync.table': 'tableName',
'hoodie.datasource.hive_sync.partition_fields': 'creation_date',
'hoodie.datasource.hive_sync.partition_extractor_class': 'org.apache.hudi.hive.MultiPartKeysValueExtractor'
}

# Write a DataFrame as a Hudi dataset
inputDF.write \
.format('org.apache.hudi') \
.option('hoodie.datasource.write.operation', 'insert') \
.options(**hudiOptions) \
.mode('overwrite') \
.save('s3://amzn-s3-demo-bucket/myhudidataset/')
```

**Anmerkung**  
Möglicherweise sehen Sie in Codebeispielen und Benachrichtigungen „hoodie“ anstelle von Hudi. In der Hudi-Codebasis wird häufig die alte Schreibweise „hoodie“ verwendet.


**DataSourceWriteOptions Referenz für Hudi**  

| Option | Description | 
| --- | --- | 
|  TABLE\$1NAME  |  Der Tabellenname, unter dem das Dataset registriert werden soll.  | 
|  TABLE\$1TYPE\$1OPT\$1KEY  |  Optional. Gibt an, ob das Dataset als `"COPY_ON_WRITE"` oder `"MERGE_ON_READ"` erstellt wird. Der Standardwert ist `"COPY_ON_WRITE"`.  | 
|  RECORDKEY\$1FIELD\$1OPT\$1KEY  |  Das Datensatzschlüsselfeld, dessen Wert als die `recordKey`-Komponente von `HoodieKey` verwendet wird. Der tatsächliche Wert wird durch Aufrufen von `.toString()` für den Feldwert abgerufen. Verschachtelte Felder können mithilfe der Punktnotation angegeben werden, z. B `a.b.c`.   | 
|  PARTITIONPATH\$1FIELD\$1OPT\$1KEY  |  Das Partitionspfadfeld, dessen Wert als die Komponente `partitionPath` von `HoodieKey` verwendet wird. Der tatsächliche Wert wird durch Aufrufen von `.toString()` für den Feldwert abgerufen.  | 
|  PRECOMBINE\$1FIELD\$1OPT\$1KEY  |  Das Feld, das in der Vorab-Kombination vor dem tatsächlichen Schreiben verwendet wird. Wenn zwei Datensätze denselben Schlüsselwert haben, wählt Hudi den Datensatz mit dem größten Wert für das Vorab-Kombinationsfeld wie von `Object.compareTo(..)` festgelegt aus.  | 

Die folgenden Optionen sind nur erforderlich, um die Hudi-Datensatz-Tabelle in Ihrem Metastore zu registrieren. Wenn Sie Ihr Hudi-Datensatz nicht als Tabelle im Hive-Metastore registrieren, sind diese Optionen nicht erforderlich.


**DataSourceWriteOptions Referenz für Hive**  

| Option | Description | 
| --- | --- | 
|  HIVE\$1DATABASE\$1OPT\$1KEY  |  Die Hive-Datenbank, mit der synchronisiert werden soll. Der Standardwert ist `"default"`.  | 
|  HIVE\$1PARTITION\$1EXTRACTOR\$1CLASS\$1OPT\$1KEY  |  Die Klasse, mit der Partitionsfeldwerte in Hive-Partitionsspalten extrahiert werden.   | 
|  HIVE\$1PARTITION\$1FIELDS\$1OPT\$1KEY  |  Das Feld im Dataset, anhand dessen Hive-Partitionsspalten bestimmt werden sollen.  | 
|  HIVE\$1SYNC\$1ENABLED\$1OPT\$1KEY  |  Wenn diese Option auf `"true"` eingestellt ist, wird das Dataset beim Apache-Hive-Metastore registriert. Der Standardwert ist `"false"`.  | 
|  HIVE\$1TABLE\$1OPT\$1KEY  |  Erforderlich Der Name der Tabelle in Hive, mit der synchronisiert werden soll. Beispiel, `"my_hudi_table_cow"`.  | 
|  HIVE\$1USER\$1OPT\$1KEY  |  Optional. Der Hive-Benutzername, der bei der Synchronisierung verwendet werden soll. Beispiel, `"hadoop"`.  | 
|  HIVE\$1PASS\$1OPT\$1KEY  |  Optional. Das von `HIVE_USER_OPT_KEY` angegebene Hive-Passwort für den Benutzer.  | 
|  HIVE\$1URL\$1OPT\$1KEY  |  Die Hive-Metastore-URL.  | 

## Upsert Daten
<a name="emr-hudi-upsert-to-datasets"></a>

Das folgende Beispiel zeigt, wie Daten durch das Schreiben von A verändert werden. DataFrame Im Gegensatz zum vorherigen Einfügebeispiel wird der Wert `OPERATION_OPT_KEY` auf `UPSERT_OPERATION_OPT_VAL` eingestellt. Darüber hinaus wird mit `.mode(SaveMode.Append)` angegeben, dass der Datensatz angehängt werden soll.

### Upsert mit Scala mit Amazon EMR 6.7 und höher
<a name="scala-upsert-67"></a>

**Anmerkung**  
Amazon EMR 6.7.0 verwendet [Apache Hudi](https://hudi.apache.org/) 0.11.0-amzn-0, das erhebliche Verbesserungen gegenüber früheren Hudi-Versionen enthält. Weitere Informationen finden Sie im [Apache-Hudi-0.11.0-Migrationshandbuch.](https://hudi.apache.org/releases/release-0.11.0/#migration-guide) Die Beispiele auf dieser Registerkarte spiegeln diese Änderungen wider.

```
// Create a new DataFrame from the first row of inputDF with a different creation_date value
val updateDF = inputDF.limit(1).withColumn("creation_date", lit("new_value"))

(updateDF.write
    .format("hudi")
    .options(hudiOptions)
    .option(DataSourceWriteOptions.OPERATION_OPT_KEY, "upsert")
    .mode(SaveMode.Append)
    .save("s3://amzn-s3-demo-bucket/myhudidataset/"))
```

### Upsert mit Scala mit Amazon EMR 6.6 und früher
<a name="scala-upsert-66"></a>

```
// Create a new DataFrame from the first row of inputDF with a different creation_date value
val updateDF = inputDF.limit(1).withColumn("creation_date", lit("new_value"))

(updateDF.write
    .format("org.apache.hudi")
    .option(DataSourceWriteOptions.OPERATION_OPT_KEY, DataSourceWriteOptions.UPSERT_OPERATION_OPT_VAL)
    .options(hudiOptions)
    .mode(SaveMode.Append)
    .save("s3://amzn-s3-demo-bucket/myhudidataset/"))
```

### Upsert mit PySpark
<a name="pyspark-upsert"></a>

```
from pyspark.sql.functions import lit

# Create a new DataFrame from the first row of inputDF with a different creation_date value
updateDF = inputDF.limit(1).withColumn('creation_date', lit('new_value'))

updateDF.write \
    .format('org.apache.hudi') \
    .option('hoodie.datasource.write.operation', 'upsert') \
    .options(**hudiOptions) \
    .mode('append') \
    .save('s3://amzn-s3-demo-bucket/myhudidataset/')
```

## Einen Datensatz löschen
<a name="emr-hudi-delete-from-datasets"></a>

Um einen Datensatz dauerhaft zu löschen, können Sie eine leere Datenlast einfügen. In diesem Fall gibt die Option `PAYLOAD_CLASS_OPT_KEY` die Klasse `EmptyHoodieRecordPayload` an. Im Beispiel wird derselbe DataFrame,, verwendet`updateDF`, der im Upsert-Beispiel verwendet wurde, um denselben Datensatz anzugeben.

### Löschen mit Scala mit Amazon EMR 6.7 und höher
<a name="scala-delete-67"></a>

**Anmerkung**  
Amazon EMR 6.7.0 verwendet [Apache Hudi](https://hudi.apache.org/) 0.11.0-amzn-0, das erhebliche Verbesserungen gegenüber früheren Hudi-Versionen enthält. Weitere Informationen finden Sie im [Apache-Hudi-0.11.0-Migrationshandbuch.](https://hudi.apache.org/releases/release-0.11.0/#migration-guide) Die Beispiele auf dieser Registerkarte spiegeln diese Änderungen wider.

```
(updateDF.write
    .format("hudi")
    .options(hudiOptions)
    .option(DataSourceWriteOptions.OPERATION_OPT_KEY, "delete")
    .mode(SaveMode.Append)
    .save("s3://amzn-s3-demo-bucket/myhudidataset/"))
```

### Löschen mit Scala mit Amazon EMR 6.6 und früher
<a name="scala-delete-66"></a>

```
(updateDF.write
    .format("org.apache.hudi")
    .option(DataSourceWriteOptions.OPERATION_OPT_KEY, DataSourceWriteOptions.UPSERT_OPERATION_OPT_VAL)
    .option(DataSourceWriteOptions.PAYLOAD_CLASS_OPT_KEY, "org.apache.hudi.common.model.EmptyHoodieRecordPayload")
    .mode(SaveMode.Append)
    .save("s3://amzn-s3-demo-bucket/myhudidataset/"))
```

### Löschen mit PySpark
<a name="pyspark-delete"></a>

```
updateDF.write \
    .format('org.apache.hudi') \
    .option('hoodie.datasource.write.operation', 'upsert') \
    .option('hoodie.datasource.write.payload.class', 'org.apache.hudi.common.model.EmptyHoodieRecordPayload') \
    .options(**hudiOptions) \
    .mode('append') \
    .save('s3://amzn-s3-demo-bucket/myhudidataset/')
```

Sie können Daten auch dauerhaft löschen, indem Sie `OPERATION_OPT_KEY ` auf `DELETE_OPERATION_OPT_VAL` einstellen, um alle Datensätze in dem von Ihnen eingereichten Datensatz zu entfernen. Anweisungen zur Durchführung von „weichen Löschungen“ und weitere Informationen zum Löschen von Daten, die in Hudi-Tabellen gespeichert sind, finden Sie unter [Löschen](https://hudi.apache.org/docs/writing_data.html#deletes) in der Apache-Hudi-Dokumentation.

## Aus einem Hudi-Datensatz lesen
<a name="emr-hudi-read-dataset"></a>

Um Daten zum aktuellen Zeitpunkt abzurufen, führt Hudi standardmäßig Snapshot-Abfragen durch. Im Folgenden finden Sie ein Beispiel für die Abfrage des in S3 geschriebenen Datensatzes in [Schreiben Sie in einen Hudi-Datensatz](#emr-hudi-dataframe). *s3://amzn-s3-demo-bucket/myhudidataset*Ersetzen Sie es durch Ihren Tabellenpfad und fügen Sie Platzhalter-Sternchen für jede Partitionsebene *sowie ein* zusätzliches Sternchen hinzu. In diesem Beispiel gibt es eine Partitionsebene, daher haben wir zwei Platzhaltersymbole hinzugefügt.

### Lesen Sie mit Scala mit Amazon EMR 6.7 und höher
<a name="scala-read-67"></a>

**Anmerkung**  
Amazon EMR 6.7.0 verwendet [Apache Hudi](https://hudi.apache.org/) 0.11.0-amzn-0, das erhebliche Verbesserungen gegenüber früheren Hudi-Versionen enthält. Weitere Informationen finden Sie im [Apache-Hudi-0.11.0-Migrationshandbuch.](https://hudi.apache.org/releases/release-0.11.0/#migration-guide) Die Beispiele auf dieser Registerkarte spiegeln diese Änderungen wider.

```
val snapshotQueryDF = spark.read
    .format("hudi")
    .load("s3://amzn-s3-demo-bucket/myhudidataset") 
    .show()
```

### Lesen mit Scala mit Amazon EMR 6.6 und früher
<a name="scala-read-66"></a>

```
(val snapshotQueryDF = spark.read
    .format("org.apache.hudi")
    .load("s3://amzn-s3-demo-bucket/myhudidataset" + "/*/*"))

snapshotQueryDF.show()
```

### Lesen Sie mit PySpark
<a name="pyspark-read"></a>

```
snapshotQueryDF = spark.read \
    .format('org.apache.hudi') \
    .load('s3://amzn-s3-demo-bucket/myhudidataset' + '/*/*')
    
snapshotQueryDF.show()
```

### Inkrementelle Abfragen
<a name="emr-hudi-incremental-query"></a>

Sie können mit Hudi auch inkrementelle Abfragen durchführen, um einen Stream von Datensätzen abzurufen, die sich seit einem bestimmten Commit-Zeitstempel geändert haben. Setzen Sie dazu das Feld `QUERY_TYPE_OPT_KEY` auf `QUERY_TYPE_INCREMENTAL_OPT_VAL`. Fügen Sie dann einen Wert für `BEGIN_INSTANTTIME_OPT_KEY` hinzu, um alle Datensätze abzurufen, die seit dem angegebenen Zeitpunkt geschrieben wurden. Inkrementelle Abfragen sind in der Regel zehnmal effizienter als ihre Gegenstücke im Batch-Modus, da sie nur geänderte Datensätze verarbeiten.

Wenn Sie inkrementelle Abfragen ausführen, verwenden Sie den Pfad der Stammtabelle (Basistabelle) ohne die für Snapshot-Abfragen verwendeten Platzhaltersterchen.

**Anmerkung**  
Presto unterstützt keine inkrementellen Abfragen.

#### Inkrementelle Abfragen mit Scala
<a name="scala-incremental-queries"></a>

```
val incQueryDF = spark.read
    .format("org.apache.hudi")
    .option(DataSourceReadOptions.QUERY_TYPE_OPT_KEY, DataSourceReadOptions.QUERY_TYPE_INCREMENTAL_OPT_VAL)
    .option(DataSourceReadOptions.BEGIN_INSTANTTIME_OPT_KEY, <beginInstantTime>)
    .load("s3://amzn-s3-demo-bucket/myhudidataset")
     
incQueryDF.show()
```

#### Inkrementelle Abfragen mit PySpark
<a name="pyspark-incremental-queries"></a>

```
readOptions = {
  'hoodie.datasource.query.type': 'incremental',
  'hoodie.datasource.read.begin.instanttime': <beginInstantTime>,
}

incQueryDF = spark.read \
    .format('org.apache.hudi') \
    .options(**readOptions) \
    .load('s3://amzn-s3-demo-bucket/myhudidataset')
    
incQueryDF.show()
```

Weitere Informationen zum Lesen von Hudi-Datensätzen finden Sie unter [Abfragen von Hudi-Tabellen](https://hudi.apache.org/docs/querying_data.html) in der Apache-Hudi-Dokumentation.

# Die Hudi-CLI verwenden
<a name="emr-hudi-cli"></a>

Sie können mit der Hudi-CLI Hudi-Datensätze verwalten, um Informationen zu Commits, zum Dateisystem, zu Statistiken und mehr anzuzeigen. Sie können mit der CLI auch Komprimierungen manuell durchführen, Komprimierungen planen oder geplante Komprimierungen abbrechen. Weitere Informationen finden Sie unter [Dateimanagement](https://hudi.apache.org/docs/cli/) in der Apache-Hudi-Dokumentation.

**So starten Sie die Hudi-CLI und stellen Sie eine Verbindung mit einem Datensatz her**

1. Verbinden mit dem Master-Knoten über SSH. Weitere Informationen finden Sie unter [Mit SSH eine Verbindung zum Hauptknoten herstellen](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html) im *Verwaltungshandbuch für Amazon EMR*.

1. Geben Sie in die Befehlszeile `/usr/lib/hudi/cli/bin/hudi-cli.sh` ein.

   Die Eingabeaufforderung ändert sich in `hudi->`.

1. Verwenden Sie den folgenden Befehl, um eine Verbindung zu einem Datensatz herzustellen. *s3://amzn-s3-demo-bucket/myhudidataset*Ersetzen Sie es durch den Pfad zu dem Datensatz, mit dem Sie arbeiten möchten. Der von uns verwendete Wert entspricht dem Wert, der in früheren Beispielen festgelegt wurde.

   ```
   connect --path s3://amzn-s3-demo-bucket/myhudidataset
   ```

   Die Eingabeaufforderung ändert sich, um das Dataset einzuschließen, mit dem Sie verbunden sind, wie im folgenden Beispiel gezeigt.

   ```
   hudi:myhudidataset->
   ```

Standardmäßig verwendet das `hudi-cli.sh` Skript in den Amazon EMR-Versionen 7.3.0 bis 7.8.0. `hudi-cli-bundle.jar` Wenn Sie auf Probleme stoßen, können Sie mit dem folgenden Befehl zurück zur klassischen Hudi-CLI wechseln:

```
/usr/lib/hudi/cli/bin/hudi-cli.sh --cliBundle false
```

Dieser Befehl führt das `hudi-cli.sh` Skript aus, setzt das `--cliBundle` Flag und weist die CLI an, die einzelnen JAR-Dateien anstelle der gebündelten JAR zu verwenden. Standardmäßig `--cliBundle` ist der auf true gesetzt, was bedeutet, dass die CLI stattdessen das gebündelte JAR verwendet.

## Verwenden von Amazon EMR 7.9.0 und höheren Versionen
<a name="emr-hudi-cli-start"></a>

**Anmerkung**  
 Das Skript **hudi-cli.sh** ist in EMR Version 7.9.0 und höher veraltet. **Amazon EMR Version 7.9.0 und höher verwendet hudi-cli-bundle .jar.** 

**Um die Hudi-CLI zu starten und eine Verbindung zu einem Datensatz herzustellen:**

1. Verbinden mit dem Master-Knoten über SSH. Weitere Informationen finden Sie unter [Mit SSH eine Verbindung zum Hauptknoten herstellen](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html) im *Verwaltungshandbuch für Amazon EMR*.

1. **Geben Sie in der Befehlszeile**/usr/lib/hudi/cli-bundle/bin/hudi- cli-with-bundle .sh** ein oder geben Sie einfach oder >hudi-cli ein **hudi-cli-with-bundle**.**

   **Die Befehlszeile ändert sich zu hudi- >.**

1. Verwenden Sie den folgenden Befehl, um eine Verbindung zu einem Datensatz herzustellen. Ersetzen Sie **s3://amzn-s3-demo-bucket/myhudidataset** durch den Pfad zu dem Datensatz, mit dem Sie arbeiten möchten. Der von uns verwendete Wert entspricht dem Wert, der in früheren Beispielen festgelegt wurde.

   ```
   connect --path s3://amzn-s3-demo-bucket/myhudidataset
   ```

1. Die Eingabeaufforderung ändert sich, um das Dataset einzuschließen, mit dem Sie verbunden sind, wie im folgenden Beispiel gezeigt.

   ```
   hudi:myhudidataset->
   ```

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

In der folgenden Tabelle sind die Version von Hudi 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).


**Versionsinformationen von Hudi**  

| Amazon-EMR-Versionsbezeichnung | Hudi-Version | Mit Hudi installierte Komponenten | 
| --- | --- | --- | 
| emr-7.12.0 | 1.0.2-amzn-1 | Not available. | 
| emr-7.11.0 | 1.0.2-amzn-0 | Not available. | 
| emr-7.10.0 | 0,15,0-amzn-7 | Not available. | 
| emr-7.9.0 | 0,15,0-amzn-6 | Not available. | 
| emr-7.8.0 | 0,15,0-amzn-5 | Not available. | 
| emr-7.7.0 | 0,15,0-amzn-4 | Not available. | 
| emr-7.6.0 | 0,15,0-amzn-3 | Not available. | 
| emr-7.5.0 | 0,15,0-amzn-2 | Not available. | 
| emr-7.4.0 | 0,15,0-amzn-1 | Not available. | 
| emr-7.3.0 | 0,15,0-amzn-0 | Not available. | 
| emr-7.2.0 | 0.14.1-amzn-1 | Not available. | 
| emr-5.36,2 | 0.10.1-amzn-1 | Not available. | 
| emr-7.1.0 | 0.14.1-amzn-0 | Not available. | 
| emr-7.0.0 | 0.14.0-amzn-1 | Not available. | 
| emr-6.15.0 | 0.14.0-amzn-0 | Not available. | 
| emr-6.14.0 | 0.13.1-amzn-2 | Not available. | 
| emr-6.13.0 | 0.13.1-amzn-1 | Not available. | 
| emr-6.12.0 | 0.13.1-amzn-0 | Not available. | 
| emr-6.11.1 | 0.13.0-amzn-0 | Not available. | 
| emr-6.11.0 | 0.13.0-amzn-0 | Not available. | 
| emr-6.10.1 | 0.12.2-amzn-0 | Not available. | 
| emr-6.10.0 | 0.12.2-amzn-0 | Not available. | 
| emr-6.9.1 | 0.12.1-amzn-0 | Not available. | 
| emr-6.9.0 | 0.12.1-amzn-0 | Not available. | 
| emr-6.8.1 | 0.11.1-amzn-0 | Not available. | 
| emr-6.8.0 | 0.11.1-amzn-0 | Not available. | 
| emr-6.7.0 | 0.11.0-amzn-0 | Not available. | 
| emr-5.36.1 | 0.10.1-amzn-1 | Not available. | 
| emr-5.36.0 | 0.10.1-amzn-1 | Not available. | 
| emr-6.6.0 | 0.10.1-amzn-0 | Not available. | 
| emr-5.35.0 | 0.9.0-amzn-2 | Not available. | 
| emr-6.5.0 | 0.9.0-amzn-1 | Not available. | 
| emr-6.4.0 | 0.8.0-amzn-0 | Not available. | 
| emr-6.3.1 | 0.7.0-amzn-0 | Not available. | 
| emr-6.3.0 | 0.7.0-amzn-0 | Not available. | 
| emr-6.2.1 | 0.6.0-amzn-1 | Not available. | 
| emr-6.2.0 | 0.6.0-amzn-1 | Not available. | 
| emr-6.1.1 | 0.5.2-incubating-amzn-2 | Not available. | 
| emr-6.1.0 | 0.5.2-incubating-amzn-2 | Not available. | 
| emr-6.0.1 | 0.5.0-incubating-amzn-1 | Not available. | 
| emr-6.0.0 | 0.5.0-incubating-amzn-1 | Not available. | 
| emr-5.34.0 | 0.9.0-amzn-0 | Not available. | 
| emr-5.33.1 | 0.7.0-amzn-1 | Not available. | 
| emr-5.33.0 | 0.7.0-amzn-1 | Not available. | 
| emr-5.32.1 | 0.6.0-amzn-0 | Not available. | 
| emr-5.32.0 | 0.6.0-amzn-0 | Not available. | 
| emr-5.31.1 | 0.6.0-amzn-0 | Not available. | 
| emr-5.31.0 | 0.6.0-amzn-0 | Not available. | 
| emr-5.30.2 | 0.5.2-incubating | Not available. | 
| emr-5.30.1 | 0.5.2-incubating | Not available. | 
| emr-5.30.0 | 0.5.2-incubating | Not available. | 
| emr-5.29.0 | 0.5.0-incubating | Not available. | 
| emr-5.28.1 | 0.5.0-incubating | Not available. | 
| emr-5.28.0 | 0.5.0-incubating | Not available. | 