

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

# AWS HealthOmics toko varian dan perubahan ketersediaan toko anotasi
<a name="variant-store-availability-change"></a>

Setelah mempertimbangkan dengan cermat, kami memutuskan untuk menutup toko AWS HealthOmics varian dan toko anotasi kepada pelanggan baru mulai 7 November 2025. Pelanggan yang sudah ada dapat terus menggunakan layanan ini seperti biasa.

Bagian berikut menjelaskan opsi migrasi untuk membantu Anda memindahkan toko varian dan toko analitik ke solusi baru. Untuk pertanyaan atau masalah apa pun, buat kasus dukungan di [support.console.aws.amazon.com](https://support.console.aws.amazon.com).

**Topics**
+ [Ikhtisar opsi migrasi](#migrate-variant-store)
+ [Opsi migrasi untuk logika ETL](#migrate-variant-store-etl-logic)
+ [Opsi migrasi untuk penyimpanan](#migrate-variant-store-storage)
+ [Analitik](#migrate-variant-store-analytics)
+ [AWS Mitra](#migrate-variant-store-partners)
+ [Contoh](#migrate-variant-store-examples)

## Ikhtisar opsi migrasi
<a name="migrate-variant-store"></a>

Opsi migrasi berikut memberikan alternatif untuk menggunakan toko varian dan toko anotasi:

1. Gunakan [implementasi referensi HealthOmics yang disediakan dari logika ETL](https://github.com/aws-samples/aws-healthomics-tutorials/tree/main/glue-variant-etl) pada. GitHub 

   Gunakan bucket tabel S3 untuk penyimpanan dan terus gunakan layanan AWS analitik yang ada. 

1. Buat solusi menggunakan kombinasi AWS layanan yang ada. 

   Untuk ETL, Anda dapat menulis pekerjaan Glue ETL khusus, atau menggunakan kode HAIL atau GLOW sumber terbuka di EMR, untuk mengubah data varian. 

   Gunakan bucket tabel S3 untuk penyimpanan dan terus gunakan layanan analitik yang ada AWS 

1. Pilih [AWS mitra](https://aws.amazon.com/partners/work-with-partners/) yang menawarkan alternatif toko varian dan anotasi.

## Opsi migrasi untuk logika ETL
<a name="migrate-variant-store-etl-logic"></a>

Pertimbangkan opsi migrasi berikut untuk logika ETL:

1. HealthOmics menyediakan kode sumber untuk pipeline ETL penyimpanan varian sebagai implementasi referensi pada GitHub. Anda dapat menggunakan pipeline ini untuk memberi daya pada proses ETL data varian yang sama dengan penyimpanan varian, tetapi dengan kontrol penuh atas logika ETL. Untuk informasi lebih lanjut, lihat [Glue Variant ETL](https://github.com/aws-samples/aws-healthomics-tutorials/tree/main/glue-variant-etl) di GitHub.

1. Untuk mengubah data varian, Anda dapat menulis pekerjaan ETL Glue kustom, atau menggunakan kode HAIL atau GLOW sumber terbuka di EMR.

## Opsi migrasi untuk penyimpanan
<a name="migrate-variant-store-storage"></a>

[https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets.html](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets.html)

Anda dapat menggunakan bucket tabel untuk tabel Iceberg yang dikelola sepenuhnya di Amazon S3.

Anda dapat memunculkan [kasus dukungan](http://support.console.aws.amazon.com.) untuk meminta HealthOmics tim memigrasikan data dari varian atau penyimpanan anotasi ke bucket tabel Amazon S3 yang dikonfigurasi. 

Setelah data diisi di keranjang tabel Amazon S3, Anda dapat menghapus toko varian dan toko anotasi. Untuk informasi selengkapnya, lihat [Menghapus toko HealthOmics analitik](https://docs.aws.amazon.com/omics/latest/dev/deleting-a-store-examples.html). 

## Analitik
<a name="migrate-variant-store-analytics"></a>

[Untuk analitik data, terus gunakan layanan AWS analitik, seperti [Amazon Athena, Amazon](https://docs.aws.amazon.com/athena)[EMR, Amazon [Redshift](https://docs.aws.amazon.com/redshift), atau Amazon](https://docs.aws.amazon.com/emr) Quick.](https://docs.aws.amazon.com/quicksight)

## AWS Mitra
<a name="migrate-variant-store-partners"></a>

Anda dapat bekerja dengan [AWS mitra](https://aws.amazon.com/partners/work-with-partners/) yang menyediakan ETL yang dapat disesuaikan, skema tabel, alat kueri dan analisis bawaan, dan antarmuka pengguna untuk berinteraksi dengan data. 

## Contoh
<a name="migrate-variant-store-examples"></a>

Contoh berikut menunjukkan cara membuat tabel yang cocok untuk menyimpan data VCF dan GVCF. 

### Athena DDL
<a name="migrate-variant-store-athena"></a>

Anda dapat menggunakan contoh DDL berikut di Athena untuk membuat tabel yang cocok untuk menyimpan data VCF dan GVCF dalam satu tabel. Contoh ini tidak sama persis dengan struktur penyimpanan varian, tetapi berfungsi dengan baik untuk kasus penggunaan umum. 

Buat nilai Anda sendiri untuk DATABASE\$1NAME dan TABLE\$1NAME saat Anda membuat tabel.

```
 CREATE TABLE <DATABASE_NAME>. <TABLE_NAME> (
  sample_name string,
  variant_name string COMMENT 'The ID field in VCF files, '.' indicates no name',
  chrom string,
  pos bigint,
  ref string,
  alt array <string>,
  qual double,
  filter string,
  genotype string,
  info map <string, string>,
  attributes map <string, string>,
  is_reference_block boolean COMMENT 'Used in GVCF for non-variant sites')
PARTITIONED BY (bucket(128, sample_name), chrom)
LOCATION '{URL}/'
TBLPROPERTIES (
  'table_type'='iceberg',
  'write_compression'='zstd'
);
```

### Buat tabel menggunakan Python (tanpa Athena)
<a name="migrate-variant-store-python"></a>

Contoh kode Python berikut menunjukkan cara membuat tabel tanpa menggunakan Athena.

```
 import boto3
from pyiceberg.catalog import Catalog, load_catalog
from pyiceberg.schema import Schema
from pyiceberg.table import Table
from pyiceberg.table.sorting import SortOrder, SortField, SortDirection, NullOrder
from pyiceberg.partitioning import PartitionSpec, PartitionField
from pyiceberg.transforms import IdentityTransform, BucketTransform
from pyiceberg.types import (
    NestedField,
    StringType,
    LongType,
    DoubleType,
    MapType,
    BooleanType,
    ListType
)


def load_s3_tables_catalog(bucket_arn: str) -> Catalog:
    session = boto3.session.Session()
    region = session.region_name or 'us-east-1'
    
    catalog_config = {
        "type": "rest",
        "warehouse": bucket_arn,
        "uri": f"https://s3tables.{region}.amazonaws.com/iceberg",
        "rest.sigv4-enabled": "true",
        "rest.signing-name": "s3tables",
        "rest.signing-region": region
    }
    
    return load_catalog("s3tables", **catalog_config)


def create_namespace(catalog: Catalog, namespace: str) -> None:
    try:
        catalog.create_namespace(namespace)
        print(f"Created namespace: {namespace}")
    except Exception as e:
        if "already exists" in str(e):
            print(f"Namespace {namespace} already exists.")
        else:
            raise e


def create_table(catalog: Catalog, namespace: str, table_name: str, schema: Schema, 
                partition_spec: PartitionSpec = None, sort_order: SortOrder = None) -> Table:
    if catalog.table_exists(f"{namespace}.{table_name}"):
        print(f"Table {namespace}.{table_name} already exists.")
        return catalog.load_table(f"{namespace}.{table_name}")
    
    create_table_args = {
        "identifier": f"{namespace}.{table_name}",
        "schema": schema,
        "properties": {"format-version": "2"}
    }
    
    if partition_spec is not None:
        create_table_args["partition_spec"] = partition_spec
    if sort_order is not None:
        create_table_args["sort_order"] = sort_order
    
    table = catalog.create_table(**create_table_args)
    print(f"Created table: {namespace}.{table_name}")
    return table


def main(bucket_arn: str, namespace: str, table_name: str):
    # Schema definition
    genomic_variants_schema = Schema(
        NestedField(1, "sample_name", StringType(), required=True),
        NestedField(2, "variant_name", StringType(), required=True),
        NestedField(3, "chrom", StringType(), required=True),
        NestedField(4, "pos", LongType(), required=True),
        NestedField(5, "ref", StringType(), required=True),
        NestedField(6, "alt", ListType(element_id=1000, element_type=StringType(), element_required=True), required=True),
        NestedField(7, "qual", DoubleType()),
        NestedField(8, "filter", StringType()),
        NestedField(9, "genotype", StringType()),
        NestedField(10, "info", MapType(key_type=StringType(), key_id=1001, value_type=StringType(), value_id=1002)),
        NestedField(11, "attributes", MapType(key_type=StringType(), key_id=2001, value_type=StringType(), value_id=2002)),
        NestedField(12, "is_reference_block", BooleanType()),
        identifier_field_ids=[1, 2, 3, 4]
    )
    
    # Partition and sort specifications
    partition_spec = PartitionSpec(
        PartitionField(source_id=1, field_id=1001, transform=BucketTransform(128), name="sample_bucket"),
        PartitionField(source_id=3, field_id=1002, transform=IdentityTransform(), name="chrom")
    )
    
    sort_order = SortOrder(
        SortField(source_id=3, transform=IdentityTransform(), direction=SortDirection.ASC, null_order=NullOrder.NULLS_LAST),
        SortField(source_id=4, transform=IdentityTransform(), direction=SortDirection.ASC, null_order=NullOrder.NULLS_LAST)
    )
    
    # Connect to catalog and create table
    catalog = load_s3_tables_catalog(bucket_arn)
    create_namespace(catalog, namespace)
    table = create_table(catalog, namespace, table_name, genomic_variants_schema, partition_spec, sort_order)
    
    return table


if __name__ == "__main__":
    bucket_arn = 'arn:aws:s3tables:<REGION>:<ACCOUNT_ID>:bucket/<TABLE_BUCKET_NAME'
    namespace = "variant_db"
    table_name = "genomic_variants"
    
    main(bucket_arn, namespace, table_name)
```