

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.

# Materialisierte Ansichten mit AWS Glue verwenden
<a name="materialized-views"></a>

AWS Glue Version 5.1 und höher unterstützt die Erstellung und Verwaltung materialisierter Apache Iceberg-Ansichten im AWS Glue-Datenkatalog. Eine materialisierte Ansicht ist eine verwaltete Tabelle, die das vorberechnete Ergebnis einer SQL-Abfrage im Apache Iceberg-Format speichert und schrittweise aktualisiert wird, wenn sich die zugrunde liegenden Quelltabellen ändern. Sie können materialisierte Ansichten verwenden, um Pipelines zur Datentransformation zu vereinfachen und die Abfrageleistung für komplexe analytische Workloads zu beschleunigen.

Wenn Sie mit Spark in AWS Glue eine materialisierte Ansicht erstellen, werden die Ansichtsdefinition und die Metadaten im AWS Glue-Datenkatalog gespeichert. Die vorberechneten Ergebnisse werden als Apache Iceberg-Tabellen in Amazon S3 S3-Tabelles-Buckets oder Amazon S3 S3-Allzweck-Buckets in Ihrem Konto gespeichert. Der AWS Glue-Datenkatalog überwacht automatisch Quelltabellen und aktualisiert materialisierte Ansichten mithilfe einer verwalteten Recheninfrastruktur.

**Topics**
+ [So funktionieren materialisierte Ansichten mit Glue AWS](#materialized-views-how-they-work)
+ [Voraussetzungen](#materialized-views-prerequisites)
+ [Konfiguration von Spark für die Verwendung materialisierter Ansichten](#materialized-views-configuring-spark)
+ [Erstellen von materialisierten Ansichten](#materialized-views-creating)
+ [Abfragen materialisierter Ansichten](#materialized-views-querying)
+ [Aktualisieren materialisierter Ansichten](#materialized-views-refreshing)
+ [Materialisierte Ansichten verwalten](#materialized-views-managing)
+ [Berechtigungen für materialisierte Ansichten](#materialized-views-permissions)
+ [Überwachung von Materialized View-Vorgängen](#materialized-views-monitoring)
+ [Beispiel: Vollständiger Workflow](#materialized-views-complete-workflow)
+ [Überlegungen und Einschränkungen](#materialized-views-considerations-limitations)

## So funktionieren materialisierte Ansichten mit Glue AWS
<a name="materialized-views-how-they-work"></a>

Materialisierte Ansichten lassen sich über die Iceberg-Unterstützung von Apache Spark in AWS Glue-Jobs und AWS Glue Studio-Notebooks in AWS Glue integrieren. Wenn Sie Ihre Spark-Sitzung für die Verwendung des AWS Glue-Datenkatalogs konfigurieren, können Sie materialisierte Ansichten mithilfe der Standard-SQL-Syntax erstellen. Der Spark-Optimierer kann Abfragen automatisch so umschreiben, dass sie materialisierte Ansichten verwenden, wenn sie eine bessere Leistung bieten, sodass der Anwendungscode nicht manuell geändert werden muss.

Der AWS Glue-Datenkatalog behandelt alle betrieblichen Aspekte der Wartung von Materialized Views, einschließlich:
+ Erkennung von Änderungen in Quelltabellen mithilfe der Metadatenebene von Apache Iceberg
+ Planung und Ausführung von Aktualisierungsvorgängen mithilfe von Managed Spark Compute
+ Feststellen, ob eine vollständige oder eine inkrementelle Aktualisierung auf der Grundlage der Datenänderungen durchgeführt werden soll
+ Speichern vorberechneter Ergebnisse im Apache Iceberg-Format für den Zugriff mit mehreren Engines

Sie können materialisierte Ansichten von AWS Glue mit denselben Spark-SQL-Schnittstellen abfragen, die Sie für normale Tabellen verwenden. Auf die vorberechneten Daten kann auch von anderen Diensten wie Amazon Athena und Amazon Redshift aus zugegriffen werden.

## Voraussetzungen
<a name="materialized-views-prerequisites"></a>

Um materialisierte Ansichten mit AWS Glue zu verwenden, benötigen Sie:
+ Ein -Konto
+ AWS Glue Version 5.1 oder höher
+ Quelltabellen im Apache Iceberg-Format, registriert im AWS Glue Data Catalog
+ AWS Lake Formation für Quelltabellen und Zieldatenbanken konfigurierte Berechtigungen
+ Ein S3-Tabelles-Bucket oder ein S3-Allzweck-Bucket, bei dem AWS Lake Formation zum Speichern von Materialized View-Daten registriert ist
+ Eine IAM-Rolle mit Berechtigungen für den Zugriff auf AWS Glue Data Catalog und Amazon S3

## Konfiguration von Spark für die Verwendung materialisierter Ansichten
<a name="materialized-views-configuring-spark"></a>

Um materialisierte Ansichten in AWS Glue zu erstellen und zu verwalten, konfigurieren Sie Ihre Spark-Sitzung mit den erforderlichen Iceberg-Erweiterungen und Katalogeinstellungen. Die Konfigurationsmethode hängt davon ab, ob Sie Glue-Jobs oder AWS AWS Glue Studio-Notizbücher verwenden.

### Konfiguration von AWS Glue-Jobs
<a name="materialized-views-configuring-glue-jobs"></a>

Wenn Sie einen AWS Glue-Job erstellen oder aktualisieren, fügen Sie die folgenden Konfigurationsparameter als Job-Parameter hinzu:

#### Für S3-Tabellen-Buckets
<a name="materialized-views-s3-tables-buckets"></a>

```
job = glue.create_job(
    Name='materialized-view-job',
    Role='arn:aws:iam::111122223333:role/GlueServiceRole',
    Command={
        'Name': 'glueetl',
        'ScriptLocation': 's3://amzn-s3-demo-bucket/scripts/mv-script.py',
        'PythonVersion': '3'
    },
    DefaultArguments={
        '--enable-glue-datacatalog': 'true',
        '--conf': 'spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions '
        '--conf spark.sql.catalog.glue_catalog=org.apache.iceberg.spark.SparkCatalog '
                  '--conf spark.sql.catalog.glue_catalog.type=glue '
                  '--conf spark.sql.catalog.glue_catalog.warehouse=s3://amzn-s3-demo-bucket/warehouse '
                  '--conf spark.sql.catalog.glue_catalog.glue.region=us-east-1 '
                  '--conf spark.sql.catalog.glue_catalog.glue.id=111122223333 '
                  '--conf spark.sql.catalog.glue_catalog.glue.account-id=111122223333 ',
                  '--conf spark.sql.catalog.glue_catalog.glue.lakeformation-enabled=true ',
                  '--conf spark.sql.catalog.s3t_catalog=org.apache.iceberg.spark.SparkCatalog '
                  '--conf spark.sql.catalog.s3t_catalog.type=glue '
                  '--conf spark.sql.catalog.s3t_catalog.glue.id=111122223333:s3tablescatalog/my-table-bucket ',
                  '--conf spark.sql.catalog.s3t_catalog.glue.account-id=111122223333 ',
                  '--conf spark.sql.catalog.s3t_catalog.glue.lakeformation-enabled=true ',
                  '--conf spark.sql.catalog.s3t_catalog.warehouse=s3://amzn-s3-demo-bucket/mv-warehouse '
                  '--conf spark.sql.catalog.s3t_catalog.glue.region=us-east-1 '
                  '--conf spark.sql.defaultCatalog=s3t_catalog '
                  '--conf spark.sql.optimizer.answerQueriesWithMVs.enabled=true '
                  '--conf spark.sql.materializedViews.metadataCache.enabled=true'
    },
    GlueVersion='5.1'
)
```

#### Für S3-Allzweck-Buckets
<a name="materialized-views-s3-general-purpose-buckets"></a>

```
job = glue.create_job(
    Name='materialized-view-job',
    Role='arn:aws:iam::111122223333:role/GlueServiceRole',
    Command={
        'Name': 'glueetl',
        'ScriptLocation': 's3://amzn-s3-demo-bucket/scripts/mv-script.py',
        'PythonVersion': '3'
    },
    DefaultArguments={
        '--enable-glue-datacatalog': 'true',
        '--conf': 'spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions '
                  '--conf spark.sql.catalog.glue_catalog=org.apache.iceberg.spark.SparkCatalog '
                  '--conf spark.sql.catalog.glue_catalog.type=glue '
                  '--conf spark.sql.catalog.glue_catalog.warehouse=s3://amzn-s3-demo-bucket/warehouse '
                  '--conf spark.sql.catalog.glue_catalog.glue.region=us-east-1 '
                  '--conf spark.sql.catalog.glue_catalog.glue.id=111122223333 ',
                  '--conf spark.sql.catalog.glue_catalog.glue.account-id=111122223333 ',
                  '--conf spark.sql.catalog.glue_catalog.glue.lakeformation-enabled=true ',
                  '--conf spark.sql.defaultCatalog=glue_catalog '
                  '--conf spark.sql.optimizer.answerQueriesWithMVs.enabled=true '
                  '--conf spark.sql.materializedViews.metadataCache.enabled=true'
    },
    GlueVersion='5.1'
)
```

### Konfiguration von AWS Glue Studio-Notebooks
<a name="materialized-views-configuring-glue-studio-notebooks"></a>

Konfigurieren Sie in AWS Glue Studio-Notizbüchern Ihre Spark-Sitzung mit dem Befehl %%configure magic am Anfang Ihres Notizbuchs:

```
%%configure
{
    "conf": {
        "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions",
        "spark.sql.catalog.glue_catalog": "org.apache.iceberg.spark.SparkCatalog",
        "spark.sql.catalog.glue_catalog.type": "glue",
        "spark.sql.catalog.glue_catalog.warehouse": "s3://amzn-s3-demo-bucket/warehouse",
        "spark.sql.catalog.glue_catalog.glue.region": "us-east-1",
        "spark.sql.catalog.glue_catalog.glue.id": "111122223333",
        "spark.sql.catalog.glue_catalog.glue.account-id": "111122223333",
        "spark.sql.catalog.glue_catalog.glue.lakeformation-enabled": "true",
        "spark.sql.defaultCatalog": "glue_catalog",
        "spark.sql.optimizer.answerQueriesWithMVs.enabled": "true",
        "spark.sql.materializedViews.metadataCache.enabled": "true"
    }
}
```

### Aktivierung der inkrementellen Aktualisierung
<a name="materialized-views-enabling-incremental-refresh"></a>

Um die inkrementelle Aktualisierungsoptimierung zu aktivieren, fügen Sie Ihren Jobparametern oder Ihrer Notebook-Konfiguration die folgenden Konfigurationseigenschaften hinzu:

```
--conf spark.sql.optimizer.incrementalMVRefresh.enabled=true
--conf spark.sql.optimizer.incrementalMVRefresh.deltaThresholdCheckEnabled=false
```

### Konfigurationsparameter
<a name="materialized-views-configuration-parameters"></a>

Die folgenden Konfigurationsparameter steuern das Verhalten der materialisierten Ansicht:
+ `spark.sql.extensions`— Aktiviert Iceberg Spark-Sitzungserweiterungen, die für die Unterstützung von Materialized Views erforderlich sind.
+ `spark.sql.optimizer.answerQueriesWithMVs.enabled`— Ermöglicht das automatische Umschreiben von Abfragen zur Verwendung materialisierter Ansichten. Auf true setzen, um diese Optimierung zu aktivieren.
+ `spark.sql.materializedViews.metadataCache.enabled`— Ermöglicht das Zwischenspeichern von Metadaten der materialisierten Ansicht zur Abfrageoptimierung. Auf „true“ setzen, um die Leistung beim Umschreiben von Abfragen zu verbessern.
+ `spark.sql.optimizer.incrementalMVRefresh.enabled`— Aktiviert die inkrementelle Aktualisierungsoptimierung. Auf true setzen, um nur geänderte Daten während Aktualisierungsvorgängen zu verarbeiten.
+ `spark.sql.optimizer.answerQueriesWithMVs.decimalAggregateCheckEnabled`— Steuert die Validierung von dezimalen Aggregatoperationen beim Umschreiben von Abfragen. Auf „false“ setzen, um bestimmte Prüfungen auf Dezimalüberlauf zu deaktivieren.

## Erstellen von materialisierten Ansichten
<a name="materialized-views-creating"></a>

Sie erstellen materialisierte Ansichten mit der SQL-Anweisung CREATE MATERIALIZED VIEW in AWS Glue-Jobs oder -Notebooks. Die View-Definition spezifiziert die Transformationslogik als eine SQL-Abfrage, die auf eine oder mehrere Quelltabellen verweist.

### Erstellen einer grundlegenden materialisierten Ansicht in AWS Glue-Jobs
<a name="materialized-views-creating-basic-glue-jobs"></a>

Das folgende Beispiel zeigt die Erstellung einer materialisierten Ansicht in einem AWS Glue-Job-Skript, wobei vollqualifizierte Tabellennamen mit dreiteiliger Benennungskonvention in der Ansichtsdefinition verwendet werden:

```
from awsglue.context import GlueContext
from pyspark.context import SparkContext

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session

# Create materialized view
spark.sql("""
    CREATE MATERIALIZED VIEW customer_orders
    AS 
    SELECT 
        customer_name, 
        COUNT(*) as order_count, 
        SUM(amount) as total_amount 
    FROM glue_catalog.sales.orders
    GROUP BY customer_name
""")
```

### Erstellen einer materialisierten Ansicht mit automatischer Aktualisierung
<a name="materialized-views-creating-automatic-refresh"></a>

Um die automatische Aktualisierung zu konfigurieren, geben Sie bei der Erstellung der Ansicht einen Aktualisierungszeitplan an. Verwenden Sie dabei vollqualifizierte Tabellennamen mit dreiteiliger Benennungskonvention in der Ansichtsdefinition:

```
spark.sql("""
    CREATE MATERIALIZED VIEW customer_orders
    SCHEDULE REFRESH EVERY 1 HOUR
    AS 
    SELECT 
        customer_name, 
        COUNT(*) as order_count, 
        SUM(amount) as total_amount 
    FROM glue_catalog.sales.orders
    GROUP BY customer_name
""")
```

### Erstellen einer materialisierten Ansicht mit katalogübergreifenden Verweisen
<a name="materialized-views-creating-cross-catalog"></a>

Wenn sich Ihre Quelltabellen in einem anderen Katalog als Ihre materialisierte Ansicht befinden, verwenden Sie vollqualifizierte Tabellennamen mit dreiteiliger Benennungskonvention sowohl im Ansichtsnamen als auch in der Ansichtsdefinition:

```
spark.sql("""
    CREATE MATERIALIZED VIEW s3t_catalog.analytics.customer_summary
    AS 
    SELECT 
        customer_name, 
        COUNT(*) as order_count, 
        SUM(amount) as total_amount 
    FROM glue_catalog.sales.orders
    GROUP BY customer_name
""")
```

### Materialisierte Ansichten in AWS Glue Studio-Notizbüchern erstellen
<a name="materialized-views-creating-glue-studio-notebooks"></a>

In AWS Glue Studio-Notizbüchern können Sie den magischen Befehl %%sql verwenden, um materialisierte Ansichten zu erstellen, wobei Sie vollqualifizierte Tabellennamen mit dreiteiliger Benennungskonvention in der Ansichtsdefinition verwenden:

```
%%sql
CREATE MATERIALIZED VIEW customer_orders
AS 
SELECT 
    customer_name, 
    COUNT(*) as order_count, 
    SUM(amount) as total_amount 
FROM glue_catalog.sales.orders
GROUP BY customer_name
```

## Abfragen materialisierter Ansichten
<a name="materialized-views-querying"></a>

Nachdem Sie eine materialisierte Ansicht erstellt haben, können Sie sie wie jede andere Tabelle mit Standard-SQL-SELECT-Anweisungen in Ihren AWS Glue-Jobs oder -Notizbüchern abfragen.

### Abfragen in AWS Glue-Jobs
<a name="materialized-views-querying-glue-jobs"></a>

```
from awsglue.context import GlueContext
from pyspark.context import SparkContext

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session

# Query materialized view
result = spark.sql("SELECT * FROM customer_orders")
result.show()
```

### Abfragen in AWS Glue Studio-Notizbüchern
<a name="materialized-views-querying-glue-studio-notebooks"></a>

```
%%sql
SELECT * FROM customer_orders
```

### Automatisches Umschreiben von Abfragen
<a name="materialized-views-automatic-query-rewrite"></a>

Wenn das automatische Umschreiben von Abfragen aktiviert ist, analysiert der Spark-Optimierer Ihre Abfragen und verwendet automatisch materialisierte Ansichten, wenn diese die Leistung verbessern können. Wenn Sie beispielsweise die folgende Abfrage ausführen:

```
result = spark.sql("""
    SELECT 
        customer_name, 
        COUNT(*) as order_count, 
        SUM(amount) as total_amount 
    FROM orders
    GROUP BY customer_name
""")
```

Der Spark-Optimierer schreibt diese Abfrage automatisch neu, sodass sie die materialisierte Ansicht customer\$1orders verwendet, anstatt die Tabelle mit den Basisbestellungen zu verarbeiten, vorausgesetzt, die materialisierte Ansicht ist aktuell.

### Überprüfung des automatischen Umschreibens von Abfragen
<a name="materialized-views-verifying-automatic-query-rewrite"></a>

Verwenden Sie den Befehl EXPLAIN EXTENDED, um zu überprüfen, ob eine Abfrage das automatische Umschreiben von Abfragen verwendet:

```
spark.sql("""
    EXPLAIN EXTENDED
    SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount 
    FROM orders
    GROUP BY customer_name
""").show(truncate=False)
```

Suchen Sie im Ausführungsplan nach dem Namen der materialisierten Ansicht in der BatchScan Operation. Wenn der Plan BatchScan glue\$1catalog.analytics.customer\$1orders statt glue\$1catalog.sales.orders anzeigt, wurde die Abfrage automatisch so umgeschrieben, dass sie die BatchScan materialisierte Ansicht verwendet.

Beachten Sie, dass das automatische Umschreiben von Abfragen einige Zeit in Anspruch nimmt, bis der Spark-Metadatencache gefüllt ist, nachdem eine materialisierte Ansicht erstellt wurde. Dieser Vorgang ist in der Regel innerhalb von 30 Sekunden abgeschlossen.

## Aktualisieren materialisierter Ansichten
<a name="materialized-views-refreshing"></a>

Sie können materialisierte Ansichten mit zwei Methoden aktualisieren: vollständige Aktualisierung oder inkrementelle Aktualisierung. Bei der vollständigen Aktualisierung wird die gesamte materialisierte Ansicht anhand aller Basistabellendaten neu berechnet, während bei der inkrementellen Aktualisierung nur die Daten verarbeitet werden, die sich seit der letzten Aktualisierung geändert haben.

### Manuelle vollständige Aktualisierung von AWS Glue-Jobs
<a name="materialized-views-manual-full-refresh-glue-jobs"></a>

So führen Sie eine vollständige Aktualisierung einer materialisierten Ansicht durch:

```
spark.sql("REFRESH MATERIALIZED VIEW customer_orders FULL")

# Verify updated results
result = spark.sql("SELECT * FROM customer_orders")
result.show()
```

### Manuelles inkrementelles Aktualisieren von AWS Glue-Jobs
<a name="materialized-views-manual-incremental-refresh-glue-jobs"></a>

Um eine inkrementelle Aktualisierung durchzuführen, stellen Sie sicher, dass die inkrementelle Aktualisierung in Ihrer Spark-Sitzungskonfiguration aktiviert ist, und führen Sie dann Folgendes aus:

```
spark.sql("REFRESH MATERIALIZED VIEW customer_orders")

# Verify updated results
result = spark.sql("SELECT * FROM customer_orders")
result.show()
```

Der AWS Glue-Datenkatalog bestimmt anhand der Ansichtsdefinition und der Menge der geänderten Daten automatisch, ob eine inkrementelle Aktualisierung möglich ist. Wenn eine inkrementelle Aktualisierung nicht möglich ist, wird der Vorgang auf eine vollständige Aktualisierung zurückgesetzt.

### Aktualisierung in AWS Glue Studio-Notizbüchern
<a name="materialized-views-refreshing-glue-studio-notebooks"></a>

Verwenden Sie in Notizbüchern den magischen Befehl %%sql:

```
%%sql
REFRESH MATERIALIZED VIEW customer_orders FULL
```

### Die Ausführung der inkrementellen Aktualisierung wird überprüft
<a name="materialized-views-verifying-incremental-refresh"></a>

Um zu bestätigen, dass die inkrementelle Aktualisierung erfolgreich ausgeführt wurde, aktivieren Sie die Debug-Protokollierung in Ihrem AWS Glue-Job:

```
from awsglue.context import GlueContext
from pyspark.context import SparkContext
import logging

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session

# Enable debug logging
logger = logging.getLogger('org.apache.spark.sql')
logger.setLevel(logging.DEBUG)

# Execute refresh
spark.sql("REFRESH MATERIALIZED VIEW customer_orders")
```

Suchen Sie in den AWS Glue-Jobprotokollen nach der folgenden Meldung:

```
DEBUG RefreshMaterializedViewExec: Executed Incremental Refresh
```

## Materialisierte Ansichten verwalten
<a name="materialized-views-managing"></a>

AWS Glue bietet SQL-Befehle für die Verwaltung des Lebenszyklus materialisierter Ansichten in Ihren Jobs und Notizbüchern.

### Beschreibung einer materialisierten Ansicht
<a name="materialized-views-describing"></a>

So zeigen Sie Metadaten zu einer materialisierten Ansicht an, einschließlich ihrer Definition, ihres Aktualisierungsstatus und des Zeitstempels der letzten Aktualisierung:

```
spark.sql("DESCRIBE EXTENDED customer_orders").show(truncate=False)
```

### Eine materialisierte Ansicht ändern
<a name="materialized-views-altering"></a>

So ändern Sie den Aktualisierungszeitplan einer vorhandenen materialisierten Ansicht:

```
spark.sql("""
    ALTER MATERIALIZED VIEW customer_orders 
    ADD SCHEDULE REFRESH EVERY 2 HOURS
""")
```

Um die automatische Aktualisierung zu entfernen:

```
spark.sql("""
    ALTER MATERIALIZED VIEW customer_orders 
    DROP SCHEDULE
""")
```

### Löschen einer materialisierten Ansicht
<a name="materialized-views-dropping"></a>

Um eine materialisierte Ansicht zu löschen:

```
spark.sql("DROP MATERIALIZED VIEW customer_orders")
```

Dieser Befehl entfernt die Definition der materialisierten Ansicht aus dem AWS Glue-Datenkatalog und löscht die zugrunde liegenden Iceberg-Tabellendaten aus Ihrem S3-Bucket.

### Materialisierte Ansichten auflisten
<a name="materialized-views-listing"></a>

Um alle materialisierten Ansichten in einer Datenbank aufzulisten:

```
spark.sql("SHOW VIEWS FROM analytics").show()
```

## Berechtigungen für materialisierte Ansichten
<a name="materialized-views-permissions"></a>

Um materialisierte Ansichten zu erstellen und zu verwalten, müssen Sie Berechtigungen konfigurieren AWS Lake Formation . Die IAM-Rolle, die die materialisierte Ansicht erstellt (die Definer-Rolle), erfordert spezielle Berechtigungen für Quelltabellen und Zieldatenbanken.

### Erforderliche Berechtigungen für die Definer-Rolle
<a name="materialized-views-required-permissions-definer-role"></a>

Die Definiererrolle muss über die folgenden Lake Formation Formation-Berechtigungen verfügen:
+ Für Quelltabellen — SELECT- oder ALL-Berechtigungen ohne Zeilen-, Spalten- oder Zellenfilter
+ In der Zieldatenbank — CREATE\$1TABLE-Berechtigung
+ Über den AWS Glue-Datenkatalog — GetTable und CreateTable API-Berechtigungen

Wenn Sie eine materialisierte Ansicht erstellen, wird der ARN der Definiererrolle in der Ansichtsdefinition gespeichert. Der AWS Glue-Datenkatalog übernimmt diese Rolle bei der Ausführung automatischer Aktualisierungsvorgänge. Wenn die Definer-Rolle den Zugriff auf Quelltabellen verliert, schlagen Aktualisierungsvorgänge fehl, bis die Berechtigungen wiederhergestellt sind.

### IAM-Berechtigungen für AWS Glue-Jobs
<a name="materialized-views-iam-permissions-glue-jobs"></a>

Für die IAM-Rolle Ihres AWS Glue-Jobs sind die folgenden Berechtigungen erforderlich:

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:GetCatalog",
                "glue:GetCatalogs",
                "glue:GetTable",
                "glue:GetTables",
                "glue:CreateTable",
                "glue:UpdateTable",
                "glue:DeleteTable",
                "glue:GetDatabase",
                "glue:GetDatabases",
                "cloudwatch:PutMetricData"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:*:*:/aws-glue/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "lakeformation:GetDataAccess"
            ],
            "Resource": "*"
        }
    ]
}
```

Die Rolle, die Sie für die automatische Aktualisierung von Materialized View verwenden, muss über die iam: PassRole -Berechtigung für die Rolle verfügen.

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": [
        "arn:aws:iam::111122223333:role/materialized-view-role-name"
      ]
    }
  ]
}
```

Damit Glue die materialisierte Ansicht automatisch für Sie aktualisiert, muss die Rolle außerdem über die folgende Vertrauensrichtlinie verfügen, die es dem Dienst ermöglicht, die Rolle zu übernehmen.

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": [
        "arn:aws:iam::111122223333:role/materialized-view-role-name"
      ]
    }
  ]
}
```

Wenn die Materialized View in S3 Tables Buckets gespeichert ist, müssen Sie der Rolle außerdem die folgende Berechtigung hinzufügen.

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3tables:PutTableMaintenanceConfiguration"
      ],
      "Resource": "arn:aws:s3tables:*:123456789012:*"
    }
  ]
}
```

### Zugriff auf materialisierte Ansichten gewähren
<a name="materialized-views-granting-access"></a>

Um anderen Benutzern Zugriff auf die Abfrage einer materialisierten Ansicht zu gewähren, verwenden Sie, AWS Lake Formation um die SELECT-Berechtigung für die Materialized View-Tabelle zu gewähren. Benutzer können die Materialized View abfragen, ohne direkten Zugriff auf die zugrunde liegenden Quelltabellen zu benötigen.

Ausführliche Informationen zur Konfiguration von Lake Formation Formation-Berechtigungen finden Sie unter Erteilen und Widerrufen von Berechtigungen für Datenkatalogressourcen im AWS Lake Formation Entwicklerhandbuch.

## Überwachung von Materialized View-Vorgängen
<a name="materialized-views-monitoring"></a>

Der AWS Glue-Datenkatalog veröffentlicht Metriken und Protokolle für Aktualisierungsvorgänge von Materialized Views auf Amazon CloudWatch. Sie können den Aktualisierungsstatus, die Dauer und das verarbeitete Datenvolumen anhand von CloudWatch Metriken überwachen.

### Job-Logs anzeigen
<a name="materialized-views-viewing-job-logs"></a>

So zeigen Sie Logs für AWS Glue-Jobs an, die materialisierte Ansichten erstellen oder aktualisieren:

1. Öffnen Sie die AWS Glue-Konsole.

1. Wählen Sie im Navigationsbereich Jobs aus.

1. Wählen Sie Ihren Job aus und wählen Sie Läufe aus.

1. Wählen Sie einen bestimmten Lauf aus und wählen Sie Protokolle, um die CloudWatch Protokolle anzuzeigen.

### Alarme einrichten
<a name="materialized-views-setting-up-alarms"></a>

Um Benachrichtigungen zu erhalten, wenn Aktualisierungsvorgänge fehlschlagen oder die erwartete Dauer überschreiten, erstellen Sie CloudWatch Alarme für Materialized View-Metriken. Sie können EventBridge Amazon-Regeln auch so konfigurieren, dass automatische Antworten auf Aktualisierungsereignisse ausgelöst werden.

## Beispiel: Vollständiger Workflow
<a name="materialized-views-complete-workflow"></a>

Das folgende Beispiel zeigt einen vollständigen Arbeitsablauf für die Erstellung und Verwendung einer materialisierten Ansicht in AWS Glue.

### Beispiel für ein AWS Glue-Jobskript
<a name="materialized-views-example-glue-job-script"></a>

```
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

# Create database and base table
spark.sql("CREATE DATABASE IF NOT EXISTS sales")
spark.sql("USE sales")

spark.sql("""
    CREATE TABLE IF NOT EXISTS orders (
        id INT,
        customer_name STRING,
        amount DECIMAL(10,2),
        order_date DATE
    )
""")

# Insert sample data
spark.sql("""
    INSERT INTO orders VALUES 
        (1, 'John Doe', 150.00, DATE('2024-01-15')),
        (2, 'Jane Smith', 200.50, DATE('2024-01-16')),
        (3, 'Bob Johnson', 75.25, DATE('2024-01-17'))
""")

# Create materialized view
spark.sql("""
    CREATE MATERIALIZED VIEW customer_summary
    AS 
    SELECT 
        customer_name, 
        COUNT(*) as order_count, 
        SUM(amount) as total_amount 
    FROM glue_catalog.sales.orders
    GROUP BY customer_name
""")

# Query the materialized view
print("Initial materialized view data:")
spark.sql("SELECT * FROM customer_summary").show()

# Insert additional data
spark.sql("""
    INSERT INTO orders VALUES 
        (4, 'Jane Smith', 350.00, DATE('2024-01-18')),
        (5, 'Bob Johnson', 100.25, DATE('2024-01-19'))
""")

# Refresh the materialized view
spark.sql("REFRESH MATERIALIZED VIEW customer_summary FULL")

# Query updated results
print("Updated materialized view data:")
spark.sql("SELECT * FROM customer_summary").show()

job.commit()
```

### Beispiel für ein AWS Glue Studio-Notizbuch
<a name="materialized-views-example-glue-studio-notebook"></a>

```
%%configure
{
    "conf": {
        "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions",
        "spark.sql.catalog.glue_catalog": "org.apache.iceberg.spark.SparkCatalog",
        "spark.sql.catalog.glue_catalog.type": "glue",
        "spark.sql.catalog.glue_catalog.warehouse": "s3://amzn-s3-demo-bucket/warehouse",
        "spark.sql.catalog.glue_catalog.glue.region": "us-east-1",
        "spark.sql.catalog.glue_catalog.glue.id": "111122223333",
        "spark.sql.catalog.glue_catalog.glue.account-id": "111122223333",
        "spark.sql.catalog.glue_catalog.glue.lakeformation-enabled": "true",
        "spark.sql.defaultCatalog": "glue_catalog",
        "spark.sql.optimizer.answerQueriesWithMVs.enabled": "true",
        "spark.sql.materializedViews.metadataCache.enabled": "true"
    }
}
```

```
%%sql
CREATE DATABASE IF NOT EXISTS sales
```

```
%%sql
USE sales
```

```
%%sql
CREATE TABLE IF NOT EXISTS orders (
    id INT,
    customer_name STRING,
    amount DECIMAL(10,2),
    order_date DATE
)
```

```
%%sql
INSERT INTO orders VALUES 
    (1, 'John Doe', 150.00, DATE('2024-01-15')),
    (2, 'Jane Smith', 200.50, DATE('2024-01-16')),
    (3, 'Bob Johnson', 75.25, DATE('2024-01-17'))
```

```
%%sql
CREATE MATERIALIZED VIEW customer_summary
AS 
SELECT 
    customer_name, 
    COUNT(*) as order_count, 
    SUM(amount) as total_amount 
FROM glue_catalog.sales.orders
GROUP BY customer_name
```

```
%%sql
SELECT * FROM customer_summary
```

```
%%sql
INSERT INTO orders VALUES 
    (4, 'Jane Smith', 350.00, DATE('2024-01-18')),
    (5, 'Bob Johnson', 100.25, DATE('2024-01-19'))
```

```
%%sql
REFRESH MATERIALIZED VIEW customer_summary FULL
```

```
%%sql
SELECT * FROM customer_summary
```

## Überlegungen und Einschränkungen
<a name="materialized-views-considerations-limitations"></a>

Beachten Sie Folgendes, wenn Sie materialisierte Ansichten mit AWS Glue verwenden:
+ Materialisierte Ansichten erfordern AWS Glue Version 5.1 oder höher.
+ Quelltabellen müssen Apache Iceberg-Tabellen sein, die im AWS Glue-Datenkatalog registriert sind. Apache Hive-, Apache Hudi- und Delta Lake-Tabellen der Linux Foundation werden beim Start nicht unterstützt.
+ Quelltabellen müssen sich in derselben Region und demselben Konto wie die materialisierte Ansicht befinden.
+ Alle Quelltabellen müssen von gesteuert werden. AWS Lake Formation Reine IAM-Berechtigungen und hybrider Zugriff werden nicht unterstützt.
+ Materialisierte Ansichten können nicht auf AWS Glue Data Catalog-Ansichten, Multidialektansichten oder andere materialisierte Ansichten als Quelltabellen verweisen.
+ Die Rolle des View Definers muss vollen Lesezugriff (SELECT- oder ALL-Berechtigung) auf alle Quelltabellen haben, ohne dass Zeilen-, Spalten- oder Zellfilter angewendet werden.
+ Materialisierte Ansichten stimmen letztendlich mit Quelltabellen überein. Während des Aktualisierungsfensters können Abfragen veraltete Daten zurückgeben. Führen Sie die manuelle Aktualisierung aus, um sofortige Konsistenz zu gewährleisten.
+ Das minimale automatische Aktualisierungsintervall beträgt eine Stunde.
+ Die inkrementelle Aktualisierung unterstützt eine eingeschränkte Teilmenge von SQL-Vorgängen. Die Viewdefinition muss ein einzelner SELECT-FROM-WHERE-GROUP BY-HAVING-Block sein und darf keine Mengenoperationen, Unterabfragen, das DISTINCT-Schlüsselwort in SELECT oder Aggregatfunktionen, Fensterfunktionen oder Joins außer INNER JOIN enthalten.
+ Die inkrementelle Aktualisierung unterstützt keine benutzerdefinierten Funktionen oder bestimmte integrierte Funktionen. Nur eine Teilmenge der integrierten Funktionen von Spark SQL wird unterstützt.
+ Beim automatischen Umschreiben von Abfragen werden nur materialisierte Ansichten berücksichtigt, deren Definitionen zu einer eingeschränkten SQL-Teilmenge gehören, ähnlich den Beschränkungen für inkrementelle Aktualisierungen.
+ Bezeichner, die andere Sonderzeichen als alphanumerische Zeichen und Unterstriche enthalten, werden in CREATE MATERIALIZED VIEW-Abfragen nicht unterstützt. Dies gilt für alle Bezeichnertypen, einschließlich catalog/namespace/table Namen, Spalten- und Strukturfeldnamen sowie Aliase. CTEs
+ Spalten in materialisierten Ansichten, die mit dem Präfix \$1\$1ivm beginnen, sind für die Verwendung durch das System reserviert. Amazon behält sich das Recht vor, diese Spalten in future Versionen zu ändern oder zu entfernen.
+ Die Klauseln SORT BY, LIMIT, OFFSET, CLUSTER BY und ORDER BY werden in Definitionen von Materialized View nicht unterstützt.
+ Regions- und kontenübergreifende Quelltabellen werden nicht unterstützt.
+ Für Tabellen, auf die in der View-Abfrage verwiesen wird, muss eine dreiteilige Benennungskonvention verwendet werden (z. B. glue\$1catalog.my\$1db.my\$1table), da bei der automatischen Aktualisierung keine standardmäßigen Katalog- und Datenbankeinstellungen verwendet werden.
+ Vollständige Aktualisierungsvorgänge überschreiben die gesamte Tabelle und sorgen dafür, dass vorherige Snapshots nicht mehr verfügbar sind.
+ Nichtdeterministische Funktionen wie rand () oder current\$1timestamp () werden in Definitionen materialisierter Ansichten nicht unterstützt.