

# Athena for Spark에서 비 Hive 테이블 형식 사용
<a name="notebooks-spark-table-formats"></a>

**참고**  
이 페이지에서는 릴리스 버전 Pyspark 엔진 버전 3에서 Python 라이브러리를 사용하는 방법을 참조합니다. 지원되는 오픈 테이블 형식 버전은 [Amazon EMR 7.12](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-7120-release.html)를 참조하세요.

Athena for Spark에서 세션 및 노트북을 사용하는 경우 Apache Hive 테이블 외에도 Linux Foundation Delta Lake, Apache Hudi, Apache Iceberg 테이블을 사용할 수 있습니다.

## 고려 사항 및 제한 사항
<a name="notebooks-spark-table-formats-considerations-and-limitations"></a>

Athena for Spark에서 Apache Hive 이외의 테이블 형식을 사용하는 경우 다음 사항을 고려합니다.
+ Apache Hive 이외에도 노트북당 하나의 테이블 형식만 지원됩니다. Athena for Spark에서 여러 테이블 형식을 사용하려면 각 테이블 형식에 대해 별도의 노트북을 생성합니다. Athena for Spark에서 노트북을 생성하는 방법에 대한 자세한 내용은 [7단계: 자체 노트북 생성](notebooks-spark-getting-started.md#notebooks-spark-getting-started-creating-your-own-notebook) 섹션을 참조하세요.
+ Delta Lake, Hudi 및 Iceberg 테이블 형식은 AWS Glue를 사용하여 Athena for Spark에서 메타스토어로 테스트되었습니다. 다른 메타스토어를 사용할 수도 있지만 현재 이러한 사용은 지원되지 않습니다.
+ 추가 테이블 형식을 사용하려면 Athena 콘솔 및 이 설명서에 나와 있는 대로 기본 `spark_catalog` 속성을 재정의합니다. 이러한 비 Hive 카탈로그는 고유한 테이블 형식 외에도 Hive 테이블을 읽을 수 있습니다.

## 테이블 버전
<a name="notebooks-spark-table-formats-versions"></a>

다음 테이블에는 Amazon Athena for Apache Spark에서 지원되는 비 Hive 테이블 버전이 나와 있습니다.


****  

| 테이블 형식 | 지원되는 버전 | 
| --- | --- | 
| Apache Iceberg | 1.2.1 | 
| Apache Hudi | 0.13 | 
| Linux Foundation Delta Lake | 2.0.2 | 

Athena for Spark에서 이러한 테이블 형식 `.jar` 파일과 해당 종속성이 Spark 드라이버 및 실행기의 클래스 경로에 로드됩니다.

Amazon Athena 노트북에서 Spark SQL을 사용하여 Iceberg, Hudi 및 Delta Lake 테이블 형식을 사용하는 방법은 *AWS 빅 데이터 블로그* 게시물 [Use Amazon Athena with Spark SQL for your open-source transactional table formats](https://aws.amazon.com/blogs/big-data/use-amazon-athena-with-spark-sql-for-your-open-source-transactional-table-formats/)를 참조하세요.

**Topics**
+ [고려 사항 및 제한 사항](#notebooks-spark-table-formats-considerations-and-limitations)
+ [테이블 버전](#notebooks-spark-table-formats-versions)
+ [Iceberg](notebooks-spark-table-formats-apache-iceberg.md)
+ [Hudi](notebooks-spark-table-formats-apache-hudi.md)
+ [Delta Lake](notebooks-spark-table-formats-linux-foundation-delta-lake.md)

# Athena for Spark에서 Apache Iceberg 테이블 사용
<a name="notebooks-spark-table-formats-apache-iceberg"></a>

[Apache Iceberg](https://iceberg.apache.org/)는 Amazon Simple Storage Service(S3)의 대형 데이터 세트를 위한 오픈 테이블 형식입니다. 이 테이블 형식은 대형 테이블, 원자성 커밋, 동시 쓰기, SQL 호환 테이블 진화 등에서 빠른 쿼리 성능을 제공합니다.

Athena for Spark에서 Apache Iceberg 테이블을 사용하려면 다음 Spark 속성을 구성합니다. Apache Iceberg를 테이블 형식으로 선택하면 Athena for Spark 콘솔에서 이러한 속성이 기본적으로 구성됩니다. 관련 단계는 [4단계: 세션 세부 정보 편집](notebooks-spark-getting-started.md#notebooks-spark-getting-started-editing-session-details) 또는 [7단계: 자체 노트북 생성](notebooks-spark-getting-started.md#notebooks-spark-getting-started-creating-your-own-notebook) 섹션을 참조하세요.

```
"spark.sql.catalog.spark_catalog": "org.apache.iceberg.spark.SparkSessionCatalog",
"spark.sql.catalog.spark_catalog.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog",
"spark.sql.catalog.spark_catalog.io-impl": "org.apache.iceberg.aws.s3.S3FileIO",
"spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
```

다음 절차는 Athena for Stork 노트북에서 Apache Iceberg 테이블을 사용하는 방법을 보여줍니다. 노트북의 새 셀에서 각 단계를 실행합니다.

**Athena for Spark에서 Apache Iceberg 테이블을 사용하려면**

1. 노트북에서 사용할 상수를 정의합니다.

   ```
   DB_NAME = "NEW_DB_NAME"
   TABLE_NAME = "NEW_TABLE_NAME"
   TABLE_S3_LOCATION = "s3://amzn-s3-demo-bucket"
   ```

1. Apache Spark [DataFrame](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/dataframe.html)을 생성합니다.

   ```
   columns = ["language","users_count"]
   data = [("Golang", 3000)]
   df = spark.createDataFrame(data, columns)
   ```

1. 데이터베이스를 생성합니다.

   ```
   spark.sql("CREATE DATABASE {} LOCATION '{}'".format(DB_NAME, TABLE_S3_LOCATION))
   ```

1. 빈 Apache Iceberg 테이블을 생성합니다.

   ```
   spark.sql("""
   CREATE TABLE {}.{} (
   language string,
   users_count int
   ) USING ICEBERG
   """.format(DB_NAME, TABLE_NAME))
   ```

1. 테이블에 데이터 행을 삽입합니다.

   ```
   spark.sql("""INSERT INTO {}.{} VALUES ('Golang', 3000)""".format(DB_NAME, TABLE_NAME))
   ```

1. 새 테이블을 쿼리할 수 있는지 확인합니다.

   ```
   spark.sql("SELECT * FROM {}.{}".format(DB_NAME, TABLE_NAME)).show()
   ```

Spark DataFrames 및 Iceberg 테이블을 사용하는 방법에 대한 자세한 내용 및 예제는 Apache Iceberg 설명서의 [Spark Queries](https://iceberg.apache.org/docs/latest/spark-queries/)를 참조하세요.

# Athena for Spark에서 Apache Hudi 테이블 사용
<a name="notebooks-spark-table-formats-apache-hudi"></a>

[https://hudi.apache.org/](https://hudi.apache.org/)는 증분 데이터 처리를 간소화하는 오픈 소스 데이터 관리 프레임워크입니다. 레코드 수준의 삽입, 업데이트, 업서트 및 삭제 작업이 더 높은 정밀도로 처리되며, 이때 오버헤드가 줄어듭니다.

Athena for Spark에서 Apache Hudi 테이블을 사용하려면 다음 Spark 속성을 구성합니다. Apache Hudi를 테이블 형식으로 선택하면 Athena for Spark 콘솔에서 이러한 속성이 기본적으로 구성됩니다. 관련 단계는 [4단계: 세션 세부 정보 편집](notebooks-spark-getting-started.md#notebooks-spark-getting-started-editing-session-details) 또는 [7단계: 자체 노트북 생성](notebooks-spark-getting-started.md#notebooks-spark-getting-started-creating-your-own-notebook) 섹션을 참조하세요.

```
"spark.sql.catalog.spark_catalog": "org.apache.spark.sql.hudi.catalog.HoodieCatalog",
"spark.serializer": "org.apache.spark.serializer.KryoSerializer",
"spark.sql.extensions": "org.apache.spark.sql.hudi.HoodieSparkSessionExtension"
```

다음 절차는 Athena for Stork 노트북에서 Apache Hudi 테이블을 사용하는 방법을 보여줍니다. 노트북의 새 셀에서 각 단계를 실행합니다.

**Athena for Spark에서 Apache Hudi 테이블을 사용하려면**

1. 노트북에서 사용할 상수를 정의합니다.

   ```
   DB_NAME = "NEW_DB_NAME"
   TABLE_NAME = "NEW_TABLE_NAME"
   TABLE_S3_LOCATION = "s3://amzn-s3-demo-bucket"
   ```

1. Apache Spark [DataFrame](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/dataframe.html)을 생성합니다.

   ```
   columns = ["language","users_count"]
   data = [("Golang", 3000)]
   df = spark.createDataFrame(data, columns)
   ```

1. 데이터베이스를 생성합니다.

   ```
   spark.sql("CREATE DATABASE {} LOCATION '{}'".format(DB_NAME, TABLE_S3_LOCATION))
   ```

1. 빈 Apache Hudi 테이블을 생성합니다.

   ```
   spark.sql("""
   CREATE TABLE {}.{} (
   language string,
   users_count int
   ) USING HUDI
   TBLPROPERTIES (
   primaryKey = 'language',
   type = 'mor'
   );
   """.format(DB_NAME, TABLE_NAME))
   ```

1. 테이블에 데이터 행을 삽입합니다.

   ```
   spark.sql("""INSERT INTO {}.{} VALUES ('Golang', 3000)""".format(DB_NAME,TABLE_NAME))
   ```

1. 새 테이블을 쿼리할 수 있는지 확인합니다.

   ```
   spark.sql("SELECT * FROM {}.{}".format(DB_NAME, TABLE_NAME)).show()
   ```

# Athena for Spark에서 Linux Foundation Delta Lake 테이블 사용
<a name="notebooks-spark-table-formats-linux-foundation-delta-lake"></a>

[Linux Foundation Delta Lake](https://delta.io/)는 빅 데이터 분석에 사용할 수 있는 테이블 형식입니다. Athena for Spark를 사용하여 Amazon S3에 저장된 Delta Lake 테이블을 직접 읽을 수 있습니다.

Athena for Spark에서 Delta Lake 테이블을 사용하려면 다음 Spark 속성을 구성합니다. Delta Lake를 테이블 형식으로 선택하면 Athena for Spark 콘솔에서 이러한 속성이 기본적으로 구성됩니다. 관련 단계는 [4단계: 세션 세부 정보 편집](notebooks-spark-getting-started.md#notebooks-spark-getting-started-editing-session-details) 또는 [7단계: 자체 노트북 생성](notebooks-spark-getting-started.md#notebooks-spark-getting-started-creating-your-own-notebook) 섹션을 참조하세요.

```
"spark.sql.catalog.spark_catalog" : "org.apache.spark.sql.delta.catalog.DeltaCatalog", 
"spark.sql.extensions" : "io.delta.sql.DeltaSparkSessionExtension"
```

다음 절차는 Athena for Stork 노트북에서 Delta Lake 테이블을 사용하는 방법을 보여줍니다. 노트북의 새 셀에서 각 단계를 실행합니다.

**Athena for Spark에서 Delta Lake 테이블을 사용하려면**

1. 노트북에서 사용할 상수를 정의합니다.

   ```
   DB_NAME = "NEW_DB_NAME" 
   TABLE_NAME = "NEW_TABLE_NAME" 
   TABLE_S3_LOCATION = "s3://amzn-s3-demo-bucket"
   ```

1. Apache Spark [DataFrame](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/dataframe.html)을 생성합니다.

   ```
   columns = ["language","users_count"] 
   data = [("Golang", 3000)] 
   df = spark.createDataFrame(data, columns)
   ```

1. 데이터베이스를 생성합니다.

   ```
   spark.sql("CREATE DATABASE {} LOCATION '{}'".format(DB_NAME, TABLE_S3_LOCATION))
   ```

1. 빈 Delta Lake 테이블을 생성합니다.

   ```
   spark.sql("""
   CREATE TABLE {}.{} ( 
     language string, 
     users_count int 
   ) USING DELTA 
   """.format(DB_NAME, TABLE_NAME))
   ```

1. 테이블에 데이터 행을 삽입합니다.

   ```
   spark.sql("""INSERT INTO {}.{} VALUES ('Golang', 3000)""".format(DB_NAME, TABLE_NAME))
   ```

1. 새 테이블을 쿼리할 수 있는지 확인합니다.

   ```
   spark.sql("SELECT * FROM {}.{}".format(DB_NAME, TABLE_NAME)).show()
   ```