

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

# Migrasi tabel yang ada ke Iceberg
<a name="table-migration"></a>

Bagian ini berfokus pada migrasi tabel gaya HIVE yang ada ke format Iceberg. [Ini berlaku untuk tabel yang menggunakan format tradisional yang kompatibel dengan HIVE seperti [Apache Parquet atau Apache ORC](https://parquet.apache.org/).](https://orc.apache.org/) Informasi ini tidak berlaku untuk tabel yang sudah menggunakan format tabel modern seperti Linux Foundation Delta Lake atau Apache Hudi.

Untuk memigrasikan tabel gaya HIVE saat ini ke format Iceberg, Anda dapat menggunakan migrasi data di tempat atau penuh: 
+ [Migrasi di tempat](table-migration-inplace.md) adalah proses menghasilkan file metadata Iceberg di atas file data yang ada.
+ [Migrasi data lengkap](table-migration-full.md) membuat lapisan metadata Iceberg dan juga menulis ulang file data yang ada dari tabel asli ke tabel Iceberg baru.

Bagian berikut memberikan gambaran rinci dari setiap metode migrasi, termasuk step-by-step instruksi dan pertimbangan untuk implementasi. Untuk informasi selengkapnya tentang strategi migrasi ini, lihat bagian [Migrasi Tabel](https://iceberg.apache.org/docs/latest/table-migration/) dari dokumentasi Gunung Es.

Setelah Anda meninjau detail metode migrasi data di tempat dan lengkap, lihat dua bagian utama berikut untuk membantu proses pengambilan keputusan Anda:
+ [Memilih strategi migrasi](migration-strategy.md) memberikan panduan melalui serangkaian pertanyaan dan skenario, untuk membantu Anda menentukan pendekatan migrasi yang paling sesuai berdasarkan persyaratan spesifik dan kasus penggunaan Anda.
+ [Ringkasan opsi migrasi](migration-options.md) menyediakan tabel komprehensif yang membandingkan karakteristik dan pertimbangan utama di berbagai opsi migrasi. Tabel ini berfungsi sebagai panduan referensi cepat dan menawarkan perbandingan fitur untuk membantu Anda memahami pertukaran teknis antar metode.

# Migrasi di tempat
<a name="table-migration-inplace"></a>

Migrasi di tempat menghilangkan kebutuhan untuk menulis ulang semua file data Anda. Sebagai gantinya, file metadata Iceberg dibuat dan ditautkan ke file data Anda yang ada. Metode ini biasanya lebih cepat dan lebih hemat biaya, terutama untuk kumpulan data besar atau tabel yang memiliki format file yang kompatibel seperti Parket, Avro, dan ORC.

**catatan**  
Migrasi di tempat tidak dapat digunakan saat bermigrasi ke Tabel [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables.html).

Iceberg menawarkan dua opsi utama untuk menerapkan migrasi di tempat:
+ Menggunakan prosedur [snapshot](https://iceberg.apache.org/docs/latest/spark-procedures/#snapshot) untuk membuat tabel Iceberg baru sambil menjaga tabel sumber tidak berubah. Untuk informasi selengkapnya, lihat [Tabel Snapshot](https://iceberg.apache.org/docs/latest/table-migration/#snapshot-table) dalam dokumentasi Gunung Es.
+ Menggunakan prosedur [migrasi](https://iceberg.apache.org/docs/latest/spark-procedures/#migrate) untuk membuat tabel Iceberg baru sebagai substitusi untuk tabel sumber. Untuk informasi selengkapnya, lihat [Memigrasi Tabel](https://iceberg.apache.org/docs/latest/table-migration/#migrate-table) di dokumentasi Gunung Es. Meskipun prosedur ini bekerja dengan Hive Metastore (HMS), saat ini tidak kompatibel dengan. AWS Glue Data Catalog[Replikasi prosedur migrasi tabel di AWS Glue Data Catalog](#replicate-data-catalog) bagian nanti dalam panduan ini memberikan solusi untuk mencapai hasil yang serupa dengan Katalog Data.

Setelah Anda melakukan migrasi di tempat dengan menggunakan salah satu `snapshot` atau`migrate`, beberapa file data mungkin tetap tidak bermigrasi. Ini biasanya terjadi ketika penulis terus menulis ke tabel sumber selama atau setelah migrasi. Untuk memasukkan file-file yang tersisa ini ke dalam tabel Iceberg Anda, Anda dapat menggunakan prosedur [add\$1files](https://iceberg.apache.org/docs/latest/spark-procedures/#add_files). Untuk informasi selengkapnya, lihat [Menambahkan File](https://iceberg.apache.org/docs/latest/table-migration/#add-files) di dokumentasi Gunung Es.

Katakanlah Anda memiliki `products` tabel berbasis Parket yang dibuat dan dihuni di Athena sebagai berikut:

```
CREATE EXTERNAL TABLE mydb.products (
    product_id INT,
    product_name STRING
)
PARTITIONED BY (category STRING)
STORED AS PARQUET
LOCATION 's3://amzn-s3-demo-bucket/products/';

INSERT INTO mydb.products
VALUES 
    (1001, 'Smartphone', 'electronics'),
    (1002, 'Laptop', 'electronics'),
    (2001, 'T-Shirt', 'clothing'),
    (2002, 'Jeans', 'clothing');
```

Bagian berikut menjelaskan bagaimana Anda dapat menggunakan `snapshot` dan `migrate` prosedur dengan tabel ini.

## Opsi 1: prosedur snapshot
<a name="in-place-snapshot"></a>

`snapshot`Prosedur ini membuat tabel Iceberg baru yang memiliki nama berbeda tetapi mereplikasi skema dan partisi tabel sumber. Operasi ini meninggalkan tabel sumber sama sekali tidak berubah baik selama dan setelah tindakan. Ini secara efektif membuat salinan tabel yang ringan, yang sangat berguna untuk menguji skenario atau eksplorasi data tanpa risiko modifikasi pada sumber data asli. Pendekatan ini memungkinkan periode transisi di mana tabel asli dan tabel Gunung Es tetap tersedia (lihat catatan di akhir bagian ini). Saat pengujian selesai, Anda dapat memindahkan tabel Iceberg baru Anda ke produksi dengan mentransisikan semua penulis dan pembaca ke tabel baru.

Anda dapat menjalankan `snapshot` prosedur dengan menggunakan Spark di model penyebaran EMR Amazon apa pun (misalnya, Amazon EMR di EC2, Amazon EMR di EKS, EMR EMR Tanpa Server) dan. AWS Glue

Untuk menguji migrasi di tempat dengan prosedur `snapshot` Spark, ikuti langkah-langkah berikut:

1. Luncurkan aplikasi Spark dan konfigurasikan sesi Spark dengan pengaturan berikut:
   + `"spark.sql.extensions":"org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"`
   + `"spark.sql.catalog.spark_catalog":"org.apache.iceberg.spark.SparkSessionCatalog"`
   + `"spark.sql.catalog.spark_catalog.type":"glue"`
   + `"spark.hadoop.hive.metastore.client.factory.class":"com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"`

1. Jalankan `snapshot` prosedur untuk membuat tabel Iceberg baru yang menunjuk ke file data tabel asli:

   ```
   spark.sql(f"""
   CALL system.snapshot(
   source_table => 'mydb.products', 
   table => 'mydb.products_iceberg',
   location => 's3://amzn-s3-demo-bucket/products_iceberg/'
   )
   """
   ).show(truncate=False)
   ```

   Rangka data keluaran berisi `imported_files_count` (jumlah file yang ditambahkan).

1. Validasi tabel baru dengan menanyakannya:

   ```
   spark.sql(f"""
   SELECT * FROM mydb.products_iceberg LIMIT 10
   """
   ).show(truncate=False)
   ```

**Catatan**  
Setelah Anda menjalankan prosedur, modifikasi file data apa pun pada tabel sumber akan membuat tabel yang dihasilkan tidak sinkron. File baru yang Anda tambahkan tidak akan terlihat di tabel Iceberg, dan file yang Anda hapus akan memengaruhi kemampuan kueri di tabel Iceberg. Untuk menghindari masalah sinkronisasi:  
Jika tabel Iceberg baru dimaksudkan untuk penggunaan produksi, hentikan semua proses yang menulis ke tabel asli dan arahkan ke tabel baru.
Jika Anda memerlukan periode transisi atau jika tabel Iceberg baru untuk tujuan pengujian, lihat [Menyinkronkan tabel Iceberg setelah migrasi di tempat nanti di bagian ini untuk panduan tentang mempertahankan sinkronisasi](#migrate-sync) tabel.
Bila Anda menggunakan `snapshot` prosedur, `gc.enabled` properti diatur ke `false` dalam properti tabel tabel Iceberg dibuat. Pengaturan ini melarang tindakan seperti`expire_snapshots`,`remove_orphan_files`, atau `DROP TABLE` dengan `PURGE` opsi, yang secara fisik akan menghapus file data. Operasi penghapusan atau penggabungan gunung es, yang tidak berdampak langsung pada file sumber, masih diperbolehkan.
Untuk membuat tabel Iceberg baru berfungsi penuh, tanpa batasan tindakan yang menghapus file data secara fisik, Anda dapat mengubah properti `gc.enabled` tabel menjadi. `true` Namun, pengaturan ini akan memungkinkan tindakan yang memengaruhi file data sumber, yang dapat merusak akses ke tabel asli. Oleh karena itu, ubah `gc.enabled` properti hanya jika Anda tidak perlu lagi mempertahankan fungsionalitas tabel asli. Contoh:  

  ```
  spark.sql(f"""
  ALTER TABLE mydb.products_iceberg
  SET TBLPROPERTIES ('gc.enabled' = 'true');
  """)
  ```

## Opsi 2: prosedur migrasi
<a name="in-place-migrate"></a>

`migrate`Prosedur ini membuat tabel Iceberg baru yang memiliki nama, skema, dan partisi yang sama dengan tabel sumber. Ketika prosedur ini berjalan, ia mengunci tabel sumber dan mengganti namanya menjadi `<table_name>_BACKUP_` (atau nama khusus yang ditentukan oleh parameter `backup_table_name` prosedur).

**catatan**  
Jika Anda mengatur parameter `drop_backup` prosedur ke`true`, tabel asli tidak akan dipertahankan sebagai cadangan.

Akibatnya, prosedur `migrate` tabel mengharuskan semua modifikasi yang mempengaruhi tabel sumber untuk dihentikan sebelum tindakan dilakukan. Sebelum Anda menjalankan `migrate` prosedur:
+ Hentikan semua penulis yang berinteraksi dengan tabel sumber.
+ Ubah pembaca dan penulis yang tidak mendukung Iceberg secara asli untuk mengaktifkan dukungan Iceberg.

Contoh:
+ Athena terus bekerja tanpa modifikasi.
+ Spark membutuhkan:
  + File Iceberg Java Archive (JAR) untuk disertakan dalam classpath (lihat Bekerja dengan Gunung [Es di Amazon EMR [dan Bekerja dengan Gunung AWS Glue](iceberg-glue.md)](iceberg-emr.md) Es di bagian sebelumnya dalam panduan ini).
  + Konfigurasi katalog sesi Spark berikut (menggunakan `SparkSessionCatalog` untuk menambahkan dukungan Iceberg sambil mempertahankan fungsionalitas katalog bawaan untuk tabel non-Iceberg):
    + `"spark.sql.extensions":"org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"`
    + `"spark.sql.catalog.spark_catalog":"org.apache.iceberg.spark.SparkSessionCatalog"`
    + `"spark.sql.catalog.spark_catalog.type":"glue"`
    + `"spark.hadoop.hive.metastore.client.factory.class":"com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"`

Setelah Anda menjalankan prosedur, Anda dapat me-restart penulis Anda dengan konfigurasi Iceberg baru mereka.

Saat ini, `migrate` prosedur tidak kompatibel dengan AWS Glue Data Catalog, karena Katalog Data tidak mendukung `RENAME` operasi. Oleh karena itu, kami menyarankan Anda menggunakan prosedur ini hanya ketika Anda bekerja dengan Hive Metastore. Jika Anda menggunakan Katalog Data, lihat [bagian selanjutnya](#replicate-data-catalog) untuk pendekatan alternatif.

Anda dapat menjalankan `migrate` prosedur di semua model penyebaran EMR Amazon (Amazon EMR di EC2, Amazon EMR di EKS, EMR EMR Tanpa Server AWS Glue) dan, tetapi memerlukan koneksi yang dikonfigurasi ke Hive Metastore. Amazon EMR di EC2 adalah pilihan yang disarankan karena menyediakan konfigurasi Hive Metastore bawaan, yang meminimalkan kompleksitas penyiapan.

Untuk menguji migrasi di tempat dengan prosedur `migrate` Spark dari EMR Amazon di kluster EC2 yang dikonfigurasi dengan Hive Metastore, ikuti langkah-langkah berikut:

1. Luncurkan aplikasi Spark dan konfigurasikan sesi Spark untuk menggunakan implementasi katalog Iceberg Hive. Misalnya, jika Anda menggunakan `pyspark` CLI:

   ```
   pyspark --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions --conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog --conf spark.sql.catalog.spark_catalog.type=hive
   ```

1. Buat `products` tabel di Hive Metastore. Ini adalah tabel sumber, yang sudah ada dalam migrasi tipikal.

   1. Buat tabel Hive `products` eksternal di Hive Metastore untuk menunjuk ke data yang ada di Amazon S3:

      ```
      spark.sql(f"""
      CREATE EXTERNAL TABLE products (
          product_id INT,
          product_name STRING
      )
      PARTITIONED BY (category STRING)
      STORED AS PARQUET
      LOCATION 's3://amzn-s3-demo-bucket/products/';
      """
      )
      ```

   1. Tambahkan partisi yang ada dengan menggunakan `MSCK REPAIR TABLE` perintah:

      ```
      spark.sql(f"""
      MSCK REPAIR TABLE products
      """
      )
      ```

   1. Konfirmasikan bahwa tabel berisi data dengan menjalankan `SELECT` kueri:

      ```
      spark.sql(f"""
      SELECT * FROM products
      """
      ).show(truncate=False)
      ```

      Contoh output:   
![\[Contoh keluaran dari validasi data selama migrasi tabel Iceberg.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/in-place-1.png)

1. Gunakan prosedur Iceberg`migrate`:

   ```
   df_res=spark.sql(f"""
   CALL system.migrate(
   table => 'default.products'
   )
   """
   )
   
   df_res.show()
   ```

   Rangka data keluaran berisi `migrated_files_count` (jumlah file yang ditambahkan ke tabel Iceberg):  
![\[Contoh keluaran dari validasi jumlah file selama migrasi tabel Iceberg.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/in-place-2.png)

1. Konfirmasikan bahwa tabel cadangan telah dibuat:

   ```
   spark.sql("show tables").show()
   ```

   Contoh output:  
![\[Contoh keluaran dari validasi cadangan selama migrasi tabel Iceberg.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/in-place-3.png)

1. Validasi operasi dengan menanyakan tabel Iceberg:

   ```
   spark.sql(f"""
   SELECT * FROM products
   """
   ).show(truncate=False)
   ```

**Catatan**  
Setelah Anda menjalankan prosedur, semua proses saat ini yang kueri atau tulis ke tabel sumber akan terpengaruh jika tidak dikonfigurasi dengan benar dengan dukungan Iceberg. Oleh karena itu, kami menyarankan Anda mengikuti langkah-langkah ini:  
Hentikan semua proses dengan menggunakan tabel sumber sebelum migrasi.
Lakukan migrasi.
Aktifkan kembali proses dengan menggunakan pengaturan Iceberg yang tepat.
Jika modifikasi file data terjadi selama proses migrasi (file baru ditambahkan atau file dihapus), tabel yang dihasilkan akan tidak sinkron. Untuk opsi sinkronisasi, lihat [Menyinkronkan tabel Iceberg setelah migrasi di tempat nanti di bagian](#migrate-sync) ini.

## Mereplikasi prosedur migrasi tabel di AWS Glue Data Catalog
<a name="replicate-data-catalog"></a>

Anda dapat mereplikasi hasil prosedur migrasi di AWS Glue Data Catalog (mencadangkan tabel asli dan menggantinya dengan tabel Iceberg) dengan mengikuti langkah-langkah berikut:

1. Gunakan prosedur snapshot untuk membuat tabel Iceberg baru yang menunjuk ke file data tabel asli.

1. Cadangkan metadata tabel asli di Katalog Data:

   1. Gunakan [GetTable](https://docs.aws.amazon.com/glue/latest/webapi/API_GetTable.html)API untuk mengambil definisi tabel sumber.

   1. Gunakan [GetPartitions](https://docs.aws.amazon.com/glue/latest/webapi/API_GetPartitions.html)API untuk mengambil definisi partisi tabel sumber.

   1. Gunakan [CreateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_CreateTable.html)API untuk membuat tabel cadangan di Katalog Data.

   1. Gunakan [BatchCreatePartition](https://docs.aws.amazon.com/glue/latest/webapi/API_BatchCreatePartition.html)API [CreatePartition](https://docs.aws.amazon.com/glue/latest/webapi/API_CreatePartition.html)atau untuk mendaftarkan partisi ke tabel cadangan di Katalog Data.

1. Ubah properti tabel `gc.enabled` Iceberg `false` untuk mengaktifkan operasi tabel lengkap.

1. Jatuhkan meja aslinya.

1. Temukan file JSON metadata tabel Iceberg di folder metadata lokasi root tabel.

1. Daftarkan tabel baru di Katalog Data dengan menggunakan prosedur [register\$1table](https://iceberg.apache.org/docs/latest/spark-procedures/#register_table) dengan nama tabel asli dan lokasi `metadata.json` file yang dibuat oleh prosedur: `snapshot`

   ```
   spark.sql(f"""
   CALL system.register_table(
       table => 'mydb.products', 
       metadata_file => '{iceberg_metadata_file}'
   )
   """
   ).show(truncate=False)
   ```

## Menyimpan tabel Iceberg tetap sinkron setelah migrasi di tempat
<a name="migrate-sync"></a>

`add_files`Prosedur ini menyediakan cara yang fleksibel untuk memasukkan data yang ada ke dalam tabel Iceberg. Secara khusus, ia mendaftarkan file data yang ada (seperti file Parquet) dengan mereferensikan jalur absolutnya di lapisan metadata Iceberg. Secara default, prosedur menambahkan file dari semua partisi tabel ke tabel Iceberg, tetapi Anda dapat secara selektif menambahkan file dari partisi tertentu. Pendekatan selektif ini sangat berguna dalam beberapa skenario:
+ Ketika partisi baru ditambahkan ke tabel sumber setelah migrasi awal.
+ Ketika file data ditambahkan ke atau dihapus dari partisi yang ada setelah migrasi awal. Namun, menambahkan kembali partisi yang dimodifikasi membutuhkan penghapusan partisi terlebih dahulu. Informasi lebih lanjut tentang ini disediakan nanti di bagian ini.

Berikut adalah beberapa pertimbangan untuk menggunakan `add_file` prosedur setelah migrasi di tempat (`snapshot`atau`migrate`) dilakukan, agar tabel Iceberg baru tetap sinkron dengan file data sumber:
+ Ketika data baru ditambahkan ke partisi baru di tabel sumber, gunakan `add_files` prosedur dengan `partition_filter` opsi untuk secara selektif memasukkan penambahan ini ke dalam tabel Iceberg:

  ```
  spark.sql(f"""
  CALL system.add_files(
  source_table => 'mydb.products', 
  table => 'mydb.products_iceberg',
  partition_filter => map('category', 'electronics')
  ).show(truncate=False)
  ```

  atau:

  ```
  spark.sql(f"""
  CALL system.add_files(
  source_table => '`parquet`.`s3://amzn-s3-demo-bucket/products/`', 
  table => 'mydb.products_iceberg',
  partition_filter => map('category', 'electronics')
  ).show(truncate=False)
  ```
+ `add_files`Prosedur memindai file baik di seluruh tabel sumber atau di partisi tertentu ketika Anda menentukan `partition_filter` opsi, dan mencoba untuk menambahkan semua file yang ditemukan ke tabel Iceberg. Secara default, properti `check_duplicate_files` prosedur diatur ke`true`, yang mencegah prosedur berjalan jika file sudah ada di tabel Iceberg. Ini penting karena tidak ada opsi bawaan untuk melewati file yang ditambahkan sebelumnya, dan menonaktifkan `check_duplicate_files` akan menyebabkan file ditambahkan dua kali, membuat duplikat. Saat file baru ditambahkan ke tabel sumber, ikuti langkah-langkah berikut:

  1. Untuk partisi baru, gunakan `add_files` dengan a `partition_filter` untuk mengimpor hanya file dari partisi baru.

  1. Untuk partisi yang ada, pertama-tama hapus partisi dari tabel Iceberg, dan kemudian jalankan kembali `add_files` untuk partisi itu, dengan menentukan. `partition_filter` Contoh:

     ```
     # We initially perform in-place migration with snapshot
     spark.sql(f"""
     CALL system.snapshot(
     source_table => 'mydb.products', 
     table => 'mydb.products_iceberg',
     location => 's3://amzn-s3-demo-bucket/products_iceberg/'
     )
     """
     ).show(truncate=False)
     
     # Then on the source table, some new files were generated under the category='electronics' partition. Example:
     spark.sql("""
     INSERT INTO mydb.products
     VALUES (1003, 'Tablet', 'electronics')
     """)
     
     # We delete the modified partition from the Iceberg table. Note this is a metadata operation only
     spark.sql("""
     DELETE FROM mydb.products_iceberg WHERE category = 'electronics'
     """)
     
     # We add_files from the modified partition
     spark.sql("""
     CALL system.add_files(
       source_table => 'mydb.products', 
       table => 'mydb.products_iceberg',
       partition_filter => map('category', 'electronics')
     )
     """).show(truncate=False)
     ```

**catatan**  
Setiap `add_files` operasi menghasilkan snapshot tabel Iceberg baru dengan data yang ditambahkan.

## Memilih strategi migrasi di tempat yang tepat
<a name="in-place-strategy"></a>

Untuk memilih strategi migrasi terbaik di tempat, pertimbangkan pertanyaan dalam tabel berikut.


| Pertanyaan | Rekomendasi | Penjelasan | 
| --- | --- | --- | 
| Apakah Anda ingin bermigrasi dengan cepat tanpa menulis ulang data sambil menjaga tabel Hive dan Iceberg dapat diakses untuk pengujian atau transisi bertahap? | `snapshot`prosedur diikuti dengan `add_files` prosedur | Gunakan `snapshot` prosedur untuk membuat tabel Iceberg baru dengan mengkloning skema dan referensi file data, tanpa memodifikasi tabel sumber. Gunakan `add_files` prosedur untuk memasukkan partisi yang ditambahkan atau dimodifikasi setelah migrasi, mencatat bahwa menambahkan kembali partisi yang dimodifikasi memerlukan penghapusan partisi terlebih dahulu. | 
| Apakah Anda menggunakan Hive Metastore dan apakah Anda ingin segera mengganti tabel Hive Anda dengan tabel Iceberg, tanpa menulis ulang data? | `migrate`prosedur diikuti dengan `add_files` prosedur | Gunakan `migrate` prosedur untuk membuat tabel Iceberg, mencadangkan tabel sumber, dan mengganti tabel asli dengan versi Iceberg.  **Catatan:** Opsi ini kompatibel dengan Hive Metastore tetapi tidak dengan. AWS Glue Data Catalog Gunakan `add_files` prosedur untuk memasukkan partisi yang ditambahkan atau dimodifikasi setelah migrasi, mencatat bahwa menambahkan kembali partisi yang dimodifikasi memerlukan penghapusan partisi terlebih dahulu. | 
| Apakah Anda menggunakan AWS Glue Data Catalog dan apakah Anda ingin segera mengganti tabel Hive Anda dengan tabel Iceberg, tanpa menulis ulang data? | Adaptasi `migrate` prosedur, diikuti dengan `add_files` prosedur | Mereplikasi perilaku `migrate` prosedur: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/table-migration-inplace.html) **Catatan:** Opsi ini memerlukan penanganan manual panggilan AWS Glue API untuk pencadangan metadata. Gunakan `add_files` prosedur untuk memasukkan partisi yang ditambahkan atau dimodifikasi setelah migrasi, mencatat bahwa menambahkan kembali partisi yang dimodifikasi memerlukan penghapusan partisi terlebih dahulu. | 

# Migrasi data lengkap
<a name="table-migration-full"></a>

Migrasi data lengkap membuat ulang file data serta metadata. Pendekatan ini membutuhkan waktu lebih lama dan membutuhkan sumber daya komputasi tambahan dibandingkan dengan migrasi di tempat. Namun, migrasi data penuh menawarkan peluang signifikan untuk meningkatkan kualitas tabel dan mengoptimalkan penyimpanan data dan pola akses.

Selama migrasi data penuh, Anda dapat melakukan beberapa operasi yang bermanfaat, seperti validasi data untuk memastikan integritas dan kebenaran, modifikasi skema untuk memenuhi persyaratan saat ini dengan lebih baik, dan penyesuaian strategi partisi untuk meningkatkan kinerja kueri. Anda juga dapat mengurutkan ulang data untuk mengoptimalkan pola akses umum, menerapkan partisi tersembunyi Iceberg untuk meningkatkan efisiensi kueri, dan melakukan konversi format file (misalnya, dari CSV ke Parket) jika diinginkan.

Kemampuan ini membuat migrasi data lengkap ideal untuk transisi ke format Iceberg dan untuk menyempurnakan dan mengoptimalkan strategi penyimpanan data Anda secara komprehensif. Meskipun migrasi data penuh membutuhkan lebih banyak waktu dan sumber daya di muka, peningkatan yang dihasilkan dalam kualitas data, organisasi, dan kinerja kueri dapat memberikan manfaat jangka panjang. Untuk menerapkan migrasi data lengkap, gunakan salah satu opsi berikut:
+ Gunakan pernyataan `CREATE TABLE ... AS SELECT` ([CTAS](https://iceberg.apache.org/docs/latest/spark-ddl/#create-table--as-select)) di Spark (di Amazon EMR atau) AWS Glue atau di Athena. Anda dapat mengatur spesifikasi partisi dan properti tabel untuk tabel Iceberg baru dengan menggunakan klausa `PARTITIONED BY` and`TBLPROPERTIES`. Anda dapat mengubah skema dan partisi untuk tabel baru sesuai dengan kebutuhan Anda alih-alih mewarisinya dari tabel sumber.
+ Baca dari tabel sumber dan tulis data sebagai tabel Iceberg baru dengan menggunakan Spark di Amazon EMR atau. AWS Glue Untuk informasi selengkapnya, lihat [Membuat tabel](https://iceberg.apache.org/docs/nightly/spark-getting-started/#creating-a-table) di dokumentasi Gunung Es.

# Memilih strategi migrasi
<a name="migration-strategy"></a>

Saat beralih ke format Iceberg, pilihan antara migrasi di tempat dan migrasi penuh sangat penting. Untuk menentukan pendekatan yang paling cocok untuk kebutuhan spesifik Anda, pertimbangkan pertanyaan dan rekomendasi berikut:


| Pertanyaan | Rekomendasi | 
| --- | --- | 
|  **Apa format file data (misalnya, CSV atau Apache Parquet)?**  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/migration-strategy.html)  | 
|  **Apakah Anda ingin memperbarui atau mengkonsolidasikan skema tabel?**  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/migration-strategy.html)  | 
|  **Apakah tabel akan mendapat manfaat dari mengubah strategi partisi?**  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/migration-strategy.html)  | 
|  **Apakah tabel akan mendapat manfaat dari menambahkan atau mengubah strategi urutan pengurutan?**  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/migration-strategy.html)  | 
|  **Apakah tabel memiliki banyak file kecil?**  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/migration-strategy.html)  | 

# Ringkasan opsi migrasi
<a name="migration-options"></a>

Tabel ini merangkum karakteristik dan pertimbangan utama untuk setiap opsi migrasi.


| **Fitur** | **Migrasi di tempat** [snapshot](table-migration-inplace.md#in-place-snapshot) | **Migrasi di tempat** [bermigrasi](table-migration-inplace.md#in-place-migrate) | **Migrasi data lengkap** [CTAS atau (BUAT TABELAN\$1SISIPKAN)](table-migration-full.md) | 
| --- | --- | --- | --- | 
| **Perbaikan tata letak data sebagai bagian dari proses migrasi** |  |  |  | 
| [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/migration-options.html) | ![\[No\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-no.png)Tidak | ![\[No\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-no.png)Tidak | ![\[Yes\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-yes.png)Ya | 
| [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/migration-options.html) | ![\[No\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-no.png)Tidak | ![\[No\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-no.png)Tidak | ![\[Yes\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-yes.png)Ya | 
| [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/migration-options.html) | ![\[No\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-no.png)Tidak | ![\[No\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-no.png)Tidak | ![\[Yes\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-yes.png)Ya | 
| [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/migration-options.html) | ![\[No\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-no.png)Tidak | ![\[No\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-no.png)Tidak | ![\[Yes\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-yes.png)Ya | 
| [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/migration-options.html) | ![\[No\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-no.png)Tidak | ![\[No\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-no.png)Tidak | ![\[Yes\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-yes.png)Ya | 
| **Format file yang didukung** | Parket, Avro, ORC | Parket, Avro, ORC | Parket, Avro, ORC, JSON, CSV | 
| **Penggantian tabel sumber dengan tabel Iceberg** | ![\[No\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-no.png)Tidak(membuat tabel baru, tetapi dengan langkah-langkah tambahan Anda dapat mengganti tabel sumber) | ![\[Yes\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-yes.png)Ya(membuat tabel cadangan dan mengganti tabel sumber dengan tabel Iceberg) | ![\[No\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-no.png)Tidak(membuat tabel baru) | 
| **Dampak tabel sumber** |  |  |  | 
| [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/migration-options.html) | Tabel sumber rusak | Merusak tabel cadangan | Aman, sumber tidak terpengaruh | 
| **Dampak tabel gunung es** |  |  |  | 
| [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/migration-options.html) | Meja Gunung Es Corrupts | Meja Gunung Es Corrupts | Tidak berdampak pada tabel Iceberg | 
| [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/migration-options.html) | Tidak terlihat di meja baru(perlu menggabungkan partisi dengan`add_files`) | Tidak terlihat di meja baru(perlu menggabungkan partisi dengan`add_files`) | Tidak terlihat di meja baru(perlu `INSERT INTO` ke tabel baru) | 
| **Biaya** | Rendah | Rendah | Lebih tinggi (penulisan ulang data lengkap) | 
| **Kecepatan migrasi** | Cepat | Cepat | Lebih lambat | 
| **Dapat digunakan untuk bermigrasi ke Tabel Amazon S3** | ![\[No\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-no.png)Tidak | ![\[No\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-no.png)Tidak | ![\[Yes\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-yes.png)Ya | 
| **Membutuhkan DDL manual** | ![\[No\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-no.png)Tidak(skema dan partisi disalin dari tabel sumber) | ![\[No\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/icon-no.png)Tidak(skema dan partisi disalin dari tabel sumber) | Jika menggunakan CTAS, hanya memerlukan menentukan partisi | 
| **Penggunaan terbaik** | Migrasi cepat tanpa menulis ulang data, memungkinkan side-by-side penggunaan Hive dan Iceberg untuk pengujian atau transisi bertahap. | Mengganti tabel Hive di tempat tanpa menulis ulang data, ketika peralihan langsung dapat diterima. | Optimalisasi Gunung Es penuh dengan penulisan ulang data. Ideal saat mendesain ulang partisi atau skema, atau meningkatkan tata letak dan kinerja. Selalu direkomendasikan jika memungkinkan. | 