

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Menggunakan tampilan terwujud dengan AWS Glue
<a name="materialized-views"></a>

AWS Glue versi 5.1 dan yang lebih baru mendukung pembuatan dan pengelolaan tampilan terwujud Apache Iceberg di Katalog Data Glue AWS . Tampilan terwujud adalah tabel terkelola yang menyimpan hasil yang telah dihitung sebelumnya dari kueri SQL dalam format Apache Iceberg dan diperbarui secara bertahap saat tabel sumber yang mendasarinya berubah. Anda dapat menggunakan tampilan terwujud untuk menyederhanakan jalur transformasi data dan mempercepat kinerja kueri untuk beban kerja analitis yang kompleks.

Saat Anda membuat tampilan terwujud menggunakan Spark in AWS Glue, definisi tampilan dan metadata disimpan di Katalog Data Glue AWS . Hasil yang telah dihitung sebelumnya disimpan sebagai tabel Apache Iceberg di bucket Amazon S3 Tables atau bucket tujuan umum Amazon S3 dalam akun Anda. Katalog Data AWS Glue secara otomatis memonitor tabel sumber dan menyegarkan tampilan terwujud menggunakan infrastruktur komputasi terkelola.

**Topics**
+ [Cara kerja tampilan terwujud dengan AWS Glue](#materialized-views-how-they-work)
+ [Prasyarat](#materialized-views-prerequisites)
+ [Mengkonfigurasi Spark untuk menggunakan tampilan terwujud](#materialized-views-configuring-spark)
+ [Membuat tampilan yang terwujud](#materialized-views-creating)
+ [Menanyakan tampilan yang terwujud](#materialized-views-querying)
+ [Menyegarkan tampilan terwujud](#materialized-views-refreshing)
+ [Mengelola tampilan yang terwujud](#materialized-views-managing)
+ [Izin untuk tampilan terwujud](#materialized-views-permissions)
+ [Memantau operasi tampilan terwujud](#materialized-views-monitoring)
+ [Contoh: Alur kerja lengkap](#materialized-views-complete-workflow)
+ [Pertimbangan dan batasan](#materialized-views-considerations-limitations)

## Cara kerja tampilan terwujud dengan AWS Glue
<a name="materialized-views-how-they-work"></a>

Tampilan terwujud terintegrasi dengan AWS Glue melalui dukungan Iceberg Apache Spark dalam pekerjaan AWS Glue dan AWS notebook Glue Studio. Saat Anda mengonfigurasi sesi Spark Anda untuk menggunakan Katalog Data AWS Glue, Anda dapat membuat tampilan terwujud menggunakan sintaks SQL standar. Pengoptimal Spark dapat secara otomatis menulis ulang kueri untuk menggunakan tampilan terwujud ketika mereka memberikan kinerja yang lebih baik, menghilangkan kebutuhan untuk memodifikasi kode aplikasi secara manual.

Katalog Data AWS Glue menangani semua aspek operasional pemeliharaan tampilan terwujud, termasuk:
+ Mendeteksi perubahan dalam tabel sumber menggunakan lapisan metadata Apache Iceberg
+ Menjadwalkan dan menjalankan operasi penyegaran menggunakan komputasi Spark terkelola
+ Menentukan apakah akan melakukan penyegaran penuh atau inkremental berdasarkan perubahan data
+ Menyimpan hasil yang telah dihitung sebelumnya dalam format Apache Iceberg untuk akses multi-engine

Anda dapat menanyakan tampilan terwujud dari AWS Glue menggunakan antarmuka Spark SQL yang sama yang Anda gunakan untuk tabel biasa. Data yang telah dihitung sebelumnya juga dapat diakses dari layanan lain termasuk Amazon Athena dan Amazon Redshift.

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

Untuk menggunakan tampilan terwujud dengan AWS Glue, Anda perlu:
+ Akun 
+ AWS Glue versi 5.1 atau yang lebih baru
+ Tabel sumber dalam format Apache Iceberg terdaftar di Katalog Data Glue AWS 
+ AWS Lake Formation izin yang dikonfigurasi untuk tabel sumber dan basis data target
+ Bucket S3 Tables atau bucket tujuan umum S3 yang terdaftar AWS Lake Formation untuk menyimpan data tampilan terwujud
+ Peran IAM dengan izin untuk mengakses AWS Glue Data Catalog dan Amazon S3

## Mengkonfigurasi Spark untuk menggunakan tampilan terwujud
<a name="materialized-views-configuring-spark"></a>

Untuk membuat dan mengelola tampilan terwujud di AWS Glue, konfigurasikan sesi Spark Anda dengan ekstensi Iceberg dan pengaturan katalog yang diperlukan. Metode konfigurasi bervariasi tergantung pada apakah Anda menggunakan pekerjaan AWS Glue atau notebook AWS Glue Studio.

### Mengkonfigurasi pekerjaan AWS Glue
<a name="materialized-views-configuring-glue-jobs"></a>

Saat membuat atau memperbarui pekerjaan AWS Glue, tambahkan parameter konfigurasi berikut sebagai parameter pekerjaan:

#### Untuk ember Tabel S3
<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'
)
```

#### Untuk ember tujuan umum S3
<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'
)
```

### Mengkonfigurasi notebook AWS Glue Studio
<a name="materialized-views-configuring-glue-studio-notebooks"></a>

Di notebook AWS Glue Studio, konfigurasikan sesi Spark Anda menggunakan perintah ajaib %%configure di awal buku catatan Anda:

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

### Mengaktifkan penyegaran inkremental
<a name="materialized-views-enabling-incremental-refresh"></a>

Untuk mengaktifkan pengoptimalan penyegaran inkremental, tambahkan properti konfigurasi berikut ke parameter pekerjaan atau konfigurasi buku catatan Anda:

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

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

Parameter konfigurasi berikut mengontrol perilaku tampilan terwujud:
+ `spark.sql.extensions`- Mengaktifkan ekstensi sesi Iceberg Spark yang diperlukan untuk dukungan tampilan terwujud.
+ `spark.sql.optimizer.answerQueriesWithMVs.enabled`— Memungkinkan penulisan ulang kueri otomatis untuk menggunakan tampilan terwujud. Setel ke true untuk mengaktifkan pengoptimalan ini.
+ `spark.sql.materializedViews.metadataCache.enabled`— Mengaktifkan caching metadata tampilan terwujud untuk optimasi kueri. Setel ke true untuk meningkatkan kinerja penulisan ulang kueri.
+ `spark.sql.optimizer.incrementalMVRefresh.enabled`— Mengaktifkan optimasi penyegaran inkremental. Setel ke true untuk memproses hanya data yang diubah selama operasi penyegaran.
+ `spark.sql.optimizer.answerQueriesWithMVs.decimalAggregateCheckEnabled`— Mengontrol validasi operasi agregat desimal dalam penulisan ulang kueri. Setel ke false untuk menonaktifkan pemeriksaan overflow desimal tertentu.

## Membuat tampilan yang terwujud
<a name="materialized-views-creating"></a>

Anda membuat tampilan terwujud menggunakan pernyataan CREATE MATERIALIZED VIEW SQL di AWS Glue jobs atau notebook. Definisi tampilan menentukan logika transformasi sebagai kueri SQL yang mereferensikan satu atau lebih tabel sumber.

### Membuat tampilan dasar yang terwujud dalam pekerjaan AWS Glue
<a name="materialized-views-creating-basic-glue-jobs"></a>

Contoh berikut menunjukkan pembuatan tampilan terwujud dalam skrip pekerjaan AWS Glue, gunakan nama tabel yang sepenuhnya memenuhi syarat dengan konvensi penamaan tiga bagian dalam definisi tampilan:

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

### Membuat tampilan terwujud dengan penyegaran otomatis
<a name="materialized-views-creating-automatic-refresh"></a>

Untuk mengonfigurasi penyegaran otomatis, tentukan jadwal penyegaran saat membuat tampilan, menggunakan nama tabel yang sepenuhnya memenuhi syarat dengan konvensi penamaan tiga bagian dalam definisi tampilan:

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

### Membuat tampilan terwujud dengan referensi lintas katalog
<a name="materialized-views-creating-cross-catalog"></a>

Jika tabel sumber Anda berada dalam katalog yang berbeda dari tampilan materialisasi Anda, gunakan nama tabel yang sepenuhnya memenuhi syarat dengan konvensi penamaan tiga bagian di kedua nama tampilan dan definisi tampilan:

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

### Membuat tampilan terwujud di notebook AWS Glue Studio
<a name="materialized-views-creating-glue-studio-notebooks"></a>

Di notebook AWS Glue Studio, Anda dapat menggunakan perintah ajaib %%sql untuk membuat tampilan terwujud, menggunakan nama tabel yang sepenuhnya memenuhi syarat dengan konvensi penamaan tiga bagian dalam definisi tampilan:

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

## Menanyakan tampilan yang terwujud
<a name="materialized-views-querying"></a>

Setelah membuat tampilan terwujud, Anda dapat menanyakannya seperti tabel lainnya menggunakan pernyataan SQL SELECT standar dalam pekerjaan atau buku catatan AWS Glue Anda.

### Menanyakan lowongan kerja AWS Glue
<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()
```

### Meminta di notebook AWS Glue Studio
<a name="materialized-views-querying-glue-studio-notebooks"></a>

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

### Penulisan ulang kueri otomatis
<a name="materialized-views-automatic-query-rewrite"></a>

Ketika penulisan ulang kueri otomatis diaktifkan, pengoptimal Spark menganalisis kueri Anda dan secara otomatis menggunakan tampilan yang terwujud ketika mereka dapat meningkatkan kinerja. Misalnya, jika Anda menjalankan kueri berikut:

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

Pengoptimal Spark secara otomatis menulis ulang kueri ini untuk menggunakan tampilan materialisasi customer\$1orders alih-alih memproses tabel pesanan dasar, asalkan tampilan terwujud saat ini.

### Memverifikasi penulisan ulang kueri otomatis
<a name="materialized-views-verifying-automatic-query-rewrite"></a>

Untuk memverifikasi apakah kueri menggunakan penulisan ulang kueri otomatis, gunakan perintah EXPLORE EXTENDED:

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

Dalam rencana eksekusi, cari nama tampilan terwujud dalam BatchScan operasi. Jika rencana menunjukkan BatchScan glue\$1catalog.analytics.customer\$1orders alih-alih glue\$1catalog.sales.orders, kueri telah ditulis ulang secara otomatis untuk menggunakan tampilan BatchScan terwujud.

Perhatikan bahwa penulisan ulang kueri otomatis memerlukan waktu agar cache metadata Spark terisi setelah membuat tampilan terwujud. Proses ini biasanya selesai dalam waktu 30 detik.

## Menyegarkan tampilan terwujud
<a name="materialized-views-refreshing"></a>

Anda dapat menyegarkan tampilan terwujud menggunakan dua metode: penyegaran penuh atau penyegaran tambahan. Penyegaran penuh menghitung ulang seluruh tampilan terwujud dari semua data tabel dasar, sementara penyegaran inkremental hanya memproses data yang telah berubah sejak penyegaran terakhir.

### Penyegaran penuh manual dalam pekerjaan AWS Glue
<a name="materialized-views-manual-full-refresh-glue-jobs"></a>

Untuk melakukan penyegaran penuh tampilan yang terwujud:

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

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

### Penyegaran inkremental manual dalam pekerjaan AWS Glue
<a name="materialized-views-manual-incremental-refresh-glue-jobs"></a>

Untuk melakukan penyegaran tambahan, pastikan penyegaran inkremental diaktifkan dalam konfigurasi sesi Spark Anda, lalu jalankan:

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

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

Katalog Data AWS Glue secara otomatis menentukan apakah penyegaran tambahan berlaku berdasarkan definisi tampilan dan jumlah data yang diubah. Jika penyegaran inkremental tidak memungkinkan, operasi akan kembali ke penyegaran penuh.

### Menyegarkan di notebook AWS Glue Studio
<a name="materialized-views-refreshing-glue-studio-notebooks"></a>

Di buku catatan, gunakan perintah ajaib %%sql:

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

### Memverifikasi eksekusi penyegaran inkremental
<a name="materialized-views-verifying-incremental-refresh"></a>

Untuk mengonfirmasi bahwa penyegaran inkremental berhasil dijalankan, aktifkan logging debug di pekerjaan AWS Glue Anda:

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

Cari pesan berikut di log pekerjaan AWS Glue:

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

## Mengelola tampilan yang terwujud
<a name="materialized-views-managing"></a>

AWS Glue menyediakan perintah SQL untuk mengelola siklus hidup tampilan terwujud dalam pekerjaan dan notebook Anda.

### Menjelaskan tampilan yang terwujud
<a name="materialized-views-describing"></a>

Untuk melihat metadata tentang tampilan terwujud, termasuk definisi, status penyegaran, dan stempel waktu penyegaran terakhir:

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

### Mengubah tampilan yang terwujud
<a name="materialized-views-altering"></a>

Untuk mengubah jadwal penyegaran tampilan terwujud yang ada:

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

Untuk menghapus penyegaran otomatis:

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

### Menjatuhkan tampilan yang terwujud
<a name="materialized-views-dropping"></a>

Untuk menghapus tampilan terwujud:

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

Perintah ini menghapus definisi tampilan terwujud dari Katalog Data AWS Glue dan menghapus data tabel Iceberg yang mendasarinya dari bucket S3 Anda.

### Daftar tampilan terwujud
<a name="materialized-views-listing"></a>

Untuk mencantumkan semua tampilan terwujud dalam database:

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

## Izin untuk tampilan terwujud
<a name="materialized-views-permissions"></a>

Untuk membuat dan mengelola tampilan terwujud, Anda harus mengonfigurasi AWS Lake Formation izin. Peran IAM yang menciptakan tampilan terwujud (peran definer) memerlukan izin khusus pada tabel sumber dan database target.

### Izin yang diperlukan untuk peran definer
<a name="materialized-views-required-permissions-definer-role"></a>

Peran definer harus memiliki izin Lake Formation berikut:
+ Pada tabel sumber - PILIH atau SEMUA izin tanpa filter baris, kolom, atau sel
+ Pada database target - izin CREATE\$1TABLE
+ Pada Katalog Data AWS Glue — GetTable dan izin CreateTable API

Saat Anda membuat tampilan terwujud, ARN peran definer disimpan dalam definisi tampilan. Katalog Data AWS Glue mengasumsikan peran ini saat menjalankan operasi penyegaran otomatis. Jika peran definer kehilangan akses ke tabel sumber, operasi refresh akan gagal hingga izin dipulihkan.

### Izin IAM untuk pekerjaan Glue AWS
<a name="materialized-views-iam-permissions-glue-jobs"></a>

Peran IAM pekerjaan AWS Glue Anda memerlukan izin berikut:

```
{
    "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": "*"
        }
    ]
}
```

Peran yang Anda gunakan untuk penyegaran otomatis Tampilan Materialisasi harus memiliki PassRole izin iam: pada peran tersebut.

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

Agar Glue secara otomatis menyegarkan tampilan terwujud untuk Anda, peran tersebut juga harus memiliki kebijakan kepercayaan berikut yang memungkinkan layanan untuk mengambil peran tersebut.

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

Jika Tampilan Materialisasi disimpan di Bucket Tabel S3, Anda juga perlu menambahkan izin berikut ke peran.

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

### Memberikan akses ke tampilan yang terwujud
<a name="materialized-views-granting-access"></a>

Untuk memberi pengguna lain akses ke kueri tampilan terwujud, gunakan AWS Lake Formation untuk memberikan izin SELECT pada tabel tampilan terwujud. Pengguna dapat menanyakan tampilan terwujud tanpa memerlukan akses langsung ke tabel sumber yang mendasarinya.

Untuk informasi lebih lanjut tentang mengonfigurasi izin Lake Formation, lihat Memberikan dan mencabut izin pada sumber daya Katalog Data di Panduan Pengembang. AWS Lake Formation 

## Memantau operasi tampilan terwujud
<a name="materialized-views-monitoring"></a>

Katalog Data AWS Glue menerbitkan metrik dan log untuk operasi penyegaran tampilan terwujud ke Amazon. CloudWatch Anda dapat memantau status penyegaran, durasi, dan volume data yang diproses melalui CloudWatch metrik.

### Melihat log pekerjaan
<a name="materialized-views-viewing-job-logs"></a>

Untuk melihat log untuk pekerjaan AWS Glue yang membuat atau menyegarkan tampilan terwujud:

1. Buka konsol AWS Glue.

1. Pilih Jobs dari panel navigasi.

1. Pilih pekerjaan Anda dan pilih Runs.

1. Pilih proses tertentu dan pilih Log untuk melihat CloudWatch log.

### Menyiapkan alarm
<a name="materialized-views-setting-up-alarms"></a>

Untuk menerima pemberitahuan saat operasi penyegaran gagal atau melebihi durasi yang diharapkan, buat CloudWatch alarm pada metrik tampilan terwujud. Anda juga dapat mengonfigurasi EventBridge aturan Amazon untuk memicu respons otomatis untuk menyegarkan peristiwa.

## Contoh: Alur kerja lengkap
<a name="materialized-views-complete-workflow"></a>

Contoh berikut menunjukkan alur kerja lengkap untuk membuat dan menggunakan tampilan terwujud di Glue. AWS 

### Contoh skrip pekerjaan AWS Glue
<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()
```

### Contoh notebook AWS Glue Studio
<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
```

## Pertimbangan dan batasan
<a name="materialized-views-considerations-limitations"></a>

Pertimbangkan hal berikut saat menggunakan tampilan terwujud dengan AWS Glue:
+ Tampilan terwujud memerlukan AWS Glue versi 5.1 atau yang lebih baru.
+ Tabel sumber harus berupa tabel Apache Iceberg yang terdaftar di Katalog Data AWS Glue. Tabel Apache Hive, Apache Hudi, dan Linux Foundation Delta Lake tidak didukung saat peluncuran.
+ Tabel sumber harus berada di Wilayah dan akun yang sama dengan tampilan terwujud.
+ Semua tabel sumber harus diatur oleh AWS Lake Formation. Izin khusus IAM dan akses hybrid tidak didukung.
+ Tampilan terwujud tidak dapat AWS mereferensikan tampilan Glue Data Catalog, tampilan multi-dialek, atau tampilan terwujud lainnya sebagai tabel sumber.
+ Peran penentu tampilan harus memiliki akses baca penuh (PILIH atau SEMUA izin) pada semua tabel sumber tanpa filter baris, kolom, atau sel yang diterapkan.
+ Tampilan terwujud pada akhirnya konsisten dengan tabel sumber. Selama jendela penyegaran, kueri dapat mengembalikan data basi. Jalankan penyegaran manual untuk konsistensi langsung.
+ Interval penyegaran otomatis minimum adalah satu jam.
+ Incremental refresh mendukung subset terbatas dari operasi SQL. Definisi tampilan harus berupa blok SELECT-FROM-WHERE-GROUP BY-HAVING tunggal dan tidak dapat berisi operasi set, subquery, kata kunci DISTINCT dalam SELECT atau fungsi agregat, fungsi jendela, atau gabungan selain INNER JOIN.
+ Penyegaran tambahan tidak mendukung fungsi yang ditentukan pengguna atau fungsi bawaan tertentu. Hanya sebagian dari fungsi built-in Spark SQL yang didukung.
+ Penulisan ulang otomatis kueri hanya mempertimbangkan tampilan terwujud yang definisinya termasuk dalam subset SQL terbatas yang mirip dengan pembatasan penyegaran tambahan.
+ Pengidentifikasi yang berisi karakter khusus selain karakter alfanumerik dan garis bawah tidak didukung dalam kueri CREATE MATERIALIZED VIEW. Ini berlaku untuk semua jenis pengenal termasuk catalog/namespace/table nama, kolom dan nama bidang struct CTEs, dan alias.
+ Kolom tampilan terwujud yang dimulai dengan awalan \$1\$1ivm dicadangkan untuk penggunaan sistem. Amazon berhak untuk memodifikasi atau menghapus kolom ini dalam rilis future.
+ Klausa SORT BY, LIMIT, OFFSET, CLUSTER BY, dan ORDER BY tidak didukung dalam definisi tampilan terwujud.
+ Tabel sumber lintas wilayah dan lintas akun tidak didukung.
+ Tabel yang direferensikan dalam kueri tampilan harus menggunakan konvensi penamaan tiga bagian (misalnya, glue\$1catalog.my\$1db.my\$1table) karena penyegaran otomatis tidak menggunakan pengaturan katalog dan database default.
+ Operasi penyegaran penuh menimpa seluruh tabel dan membuat snapshot sebelumnya tidak tersedia.
+ Fungsi non-deterministik seperti rand () atau current\$1timestamp () tidak didukung dalam definisi tampilan terwujud.