

# AWS Glue에서 Avro 형식 사용
<a name="aws-glue-programming-etl-format-avro-home"></a>

AWS Glue는 소스에서 데이터를 검색하고 다양한 데이터 형식으로 저장 및 전송되는 대상에 데이터를 씁니다. 데이터가 Avro 데이터 형식으로 저장 또는 전송되는 경우 이 문서에서는 AWS Glue에서 데이터를 사용하는 데 사용할 수 있는 기능을 소개합니다.

AWS Glue는 Avro 형식 사용을 지원합니다. 이 형식은 성능 중심의 행 기반 데이터 형식입니다. 표준 기관의 형식에 대한 소개는 [Apache Avro 1.8.2 설명서 개요](https://avro.apache.org/docs/1.8.2/)를 참조하세요.

AWS Glue를 사용하여 Amazon S3와 스트리밍 소스에서 Avro 파일을 읽을 수 있을 뿐만 아니라 Amazon S3에 Avro 파일을 쓸 수 있습니다. S3에서 Avro 파일이 포함된 `bzip2` 및 `gzip` 아카이브를 읽고 쓸 수 있습니다. 또한 Avro 파일이 포함된 `deflate`, `snappy`, `xz` 아카이브를 쓸 수 있습니다. 이 페이지에서 설명하는 구성 대신 [S3 연결 파라미터](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-s3)에서 압축 동작을 구성할 수 있습니다.

다음 표에서는 Avro 형식 옵션을 지원하는 일반적인 AWS Glue 기능을 보여 줍니다.


| 읽기 | 쓰기 | 스트리밍 읽기 | 작은 파일 그룹화 | 작업 북마크 | 
| --- | --- | --- | --- | --- | 
| 지원 | 지원 | 지원\$1 | 지원되지 않음 | 지원 | 

\$1제한적으로 지원됩니다. 자세한 내용은 [Avro 스트리밍 소스에 대한 참고 사항 및 제한 사항](add-job-streaming.md#streaming-avro-notes) 섹션을 참조하세요.

## 예: S3에서 Avro 파일 또는 폴더 읽기
<a name="aws-glue-programming-etl-format-avro-read"></a>

** 사전 조건:** 읽으려는 Avro 파일 또는 폴더에 대한 S3 경로(`s3path`)가 필요합니다.

**구성:** 함수 옵션에서 `format="avro"`를 지정합니다. `connection_options`에서 `paths` 키를 사용하여 `s3path`를 지정합니다. `connection_options`에서 리더와 S3가 상호 작용하는 방식을 구성할 수 있습니다. 자세한 내용은 AWS Glue: [Amazon S3 연결 옵션 참조](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-s3)의 ETL 입력 및 출력에 대한 데이터 형식 옵션을 참조하세요. 리더에서 `format_options`의 Avro 파일을 해석하는 방법을 구성할 수 있습니다. 자세한 내용은 [Avro 구성 참조](#aws-glue-programming-etl-format-avro-reference)를 참조하세요.

다음 AWS Glue ETL 스크립트는 S3에서 Avro 파일 또는 폴더를 읽는 프로세스를 보여 줍니다.

------
#### [ Python ]

이 예에서는 [create\$1dynamic\$1frame.from\$1options](aws-glue-api-crawler-pyspark-extensions-glue-context.md#aws-glue-api-crawler-pyspark-extensions-glue-context-create_dynamic_frame_from_options) 메서드를 사용합니다.

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

sc = SparkContext.getOrCreate()
glueContext = GlueContext(sc)

dynamicFrame = glueContext.create_dynamic_frame.from_options(
    connection_type="s3",
    connection_options={"paths": ["s3://s3path"]},
    format="avro"
)
```

------
#### [ Scala ]

이 예에서는 [getSourceWithFormat](glue-etl-scala-apis-glue-gluecontext.md#glue-etl-scala-apis-glue-gluecontext-defs-getSourceWithFormat) 작업을 사용합니다.

```
import com.amazonaws.services.glue.util.JsonOptions
import com.amazonaws.services.glue.GlueContext
import org.apache.spark.sql.SparkContext

object GlueApp {
  def main(sysArgs: Array[String]): Unit = {
    val spark: SparkContext = new SparkContext()
    val glueContext: GlueContext = new GlueContext(spark)

    val dynamicFrame = glueContext.getSourceWithFormat(
      connectionType="s3",
      format="avro",
      options=JsonOptions("""{"paths": ["s3://s3path"]}""")
    ).getDynamicFrame()
  }
```

------

## 예: S3에 Avro 파일 및 폴더 쓰기
<a name="aws-glue-programming-etl-format-avro-write"></a>

**사전 조건:** 초기화된 DataFrame(`dataFrame`) 또는 DynamicFrame(`dynamicFrame`)이 필요합니다. 예상되는 S3 출력 경로(`s3path`)도 필요합니다.

**구성:** 함수 옵션에서 `format="avro"`를 지정합니다. `connection_options`에서 `paths` 키를 사용하여 `s3path`를 지정합니다. `connection_options`에서 라이터가 S3와 상호 작용하는 방식을 추가로 변경할 수 있습니다. 자세한 내용은 AWS Glue: [Amazon S3 연결 옵션 참조](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-s3)의 ETL 입력 및 출력에 대한 데이터 형식 옵션을 참조하세요. 작가가 `format_options`에서 Avro 파일을 해석하는 방식을 변경할 수 있습니다. 자세한 내용은 [Avro 구성 참조](#aws-glue-programming-etl-format-avro-reference)를 참조하세요.

다음 AWS Glue ETL 스크립트는 S3로 Avro 파일 및 폴더를 쓰는 프로세스를 보여줍니다.

------
#### [ Python ]

이 예에서는 [write\$1dynamic\$1frame.from\$1options](aws-glue-api-crawler-pyspark-extensions-glue-context.md#aws-glue-api-crawler-pyspark-extensions-glue-context-write_dynamic_frame_from_options) 메서드를 사용합니다.

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

sc = SparkContext.getOrCreate()
glueContext = GlueContext(sc)

glueContext.write_dynamic_frame.from_options(
    frame=dynamicFrame,
    connection_type="s3",
    format="avro",
    connection_options={
        "path": "s3://s3path"
    }
)
```

------
#### [ Scala ]

이 예에서는 [getSinkWithFormat](glue-etl-scala-apis-glue-gluecontext.md#glue-etl-scala-apis-glue-gluecontext-defs-getSinkWithFormat) 메서드를 사용합니다.

```
import com.amazonaws.services.glue.util.JsonOptions
import com.amazonaws.services.glue.{DynamicFrame, GlueContext}
import org.apache.spark.SparkContext

object GlueApp {
  def main(sysArgs: Array[String]): Unit = {
    val spark: SparkContext = new SparkContext()
    val glueContext: GlueContext = new GlueContext(spark)

    glueContext.getSinkWithFormat(
      connectionType="s3",
      options=JsonOptions("""{"path": "s3://s3path"}"""),
      format="avro"
    ).writeDynamicFrame(dynamicFrame)
  }
}
```

------

## Avro 구성 참조
<a name="aws-glue-programming-etl-format-avro-reference"></a>

AWS Glue 라이브러리가 `format="avro"`를 지정한 곳이라면 어디에서든 다음 `format_options` 값을 사용할 수 있습니다.
+ `version` - 지원하는 Apache Avro 리더/라이터 포맷의 버전을 지정합니다. 기본값은 "1.7"입니다. `format_options={"version": “1.8”}`를 지정해 Avro 논리적 유형 읽기 및 쓰기를 활성화할 수 있습니다. 자세한 내용은 [Apache Avro 1.7.7 사양](https://avro.apache.org/docs/1.7.7/spec.html) 및 [Apache Avro 1.8.2 사양](https://avro.apache.org/docs/1.8.2/spec.html)을 참조하십시오.

  Apache Avro 1.8 커넥터는 다음과 같은 논리적 유형 변환을 지원합니다.

리더의 경우: 다음 테이블은 Avro 리더 1.7 및 1.8을 위한 Avro 데이터 유형(논리적 유형, Avro 기본 유형)과 AWS Glue `DynamicFrame` 데이터 유형 간 변환을 보여줍니다.


| Avro 데이터 형식: 논리적 유형 | Avro 데이터 형식: Avro 기본 유형 | GlueDynamicFrame 데이터 유형:Avro 리더 1.7 | GlueDynamicFrame 데이터 유형: Avro 리더 1.8 | 
| --- | --- | --- | --- | 
| 10진수 | bytes | BINARY | 10진수 | 
| 10진수 | 고정 | BINARY | 10진수 | 
| 날짜 | int | INT | 날짜 | 
| 시간(밀리초) | int | INT | INT | 
| 시간(마이크로초) | long | LONG | LONG | 
| 타임스탬프(밀리초) | long | LONG | Timestamp | 
| 타임스탬프(마이크로초) | long | LONG | LONG | 
| 기간(논리적 유형 아님) | 고정(12) | BINARY | BINARY | 

라이터의 경우: 다음 테이블은 Avro 라이터 1.7 및 1.8을 위한 AWS Glue `DynamicFrame` 데이터 유형과 Avro 데이터 유형 간 변환을 보여줍니다.


| AWS Glue `DynamicFrame` 데이터 유형 | Avro 데이터 형식:Avro 라이터 1.7 | Avro 데이터 형식:Avro 라이터 1.8 | 
| --- | --- | --- | 
| 10진수 | String | decimal | 
| 날짜 | String | date | 
| Timestamp | String | timestamp-micros | 

## Avro Spark DataFrame 지원
<a name="aws-glueprogramming-etl-format-avro-dataframe-support"></a>

Spark DataFrame API에서 Avro를 사용하려면 해당 Spark 버전에 대한 Spark Avro 플러그인을 설치해야 합니다. 작업에서 사용할 수 있는 Spark 버전은 AWS Glue 버전에 따라 결정됩니다. Spark 버전에 대한 자세한 내용은 [AWS Glue 버전](release-notes.md) 섹션을 참조하세요. 이 플러그인은 Apache에서 유지 관리하며 구체적인 지원을 보장하지는 않습니다.

AWS Glue 2.0에서 - Spark Avro 플러그인의 버전 2.4.3을 사용하세요. 이 JAR는 Maven Central에서 찾을 수 있습니다. [org.apache.spark:spark-avro\$12.12:2.4.3](https://search.maven.org/artifact/org.apache.spark/spark-avro_2.12/3.1.1/jar)을 참조하세요.

AWS Glue 3.0에서 - Spark Avro 플러그인의 버전 3.1.1을 사용하세요. 이 JAR는 Maven Central에서 찾을 수 있습니다. [org.apache.spark:spark-avro\$12.12:3.1.1](https://search.maven.org/artifact/org.apache.spark/spark-avro_2.12/3.1.1/jar)을 참조하세요.

추가 JAR을 AWS Glue ETL 작업에 포함하려면 `--extra-jars` 작업 파라미터를 사용하세요. 작업 파라미터에 대한 자세한 내용을 알아보려면 [AWS Glue 작업에서 작업 파라미터 사용](aws-glue-programming-etl-glue-arguments.md) 섹션을 참조하세요. AWS Management Console에서 이 매개 변수를 구성할 수도 있습니다.