AWS Glue에서 XML 형식 사용 - AWS Glue

AWS Glue에서 XML 형식 사용

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

AWS Glue는 XML 형식 사용을 지원합니다. 이 형식은 행이나 열을 기반으로 하지 않는 고도로 구성 가능하고 엄격하게 정의된 데이터 구조를 나타냅니다. XML은 고도로 표준화되어 있습니다. 표준 기관의 형식에 대한 소개는 XML 필수 사항을 참조하십시오.

AWS Glue를 사용하여 Amazon S3는 물론 XML 파일이 포함된 bzipgzip 아카이브에서 XML 파일을 읽을 수 있습니다. 이 페이지에서 설명하는 구성 대신 Amazon S3 연결에서 압축 동작을 구성할 수 있습니다.

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

읽기(Read) 쓰기 스트리밍 읽기 작은 파일 그룹화 작업 북마크
지원 지원되지 않음 지원되지 않음 지원 지원

예: S3에서 XML 읽기

XML 리더는 XML 태그 이름을 사용합니다. 입력 내에 해당 태그가 있는 요소를 검사하여 스키마를 추론하고 DynamicFrame을 해당 값으로 채웁니다. AWS Glue XML 기능은 Apache Spark용 XML 데이터 소스와 비슷하게 작동합니다. 이 리더를 해당 프로젝트의 문서와 비교하면 기본 동작에 대한 통찰력을 얻을 수 있습니다.

사전 조건: 읽고자 하는 CSV 파일 또는 폴더에 대한 S3 경로(s3path), 그리고 XML 파일에 관한 약간의 정보가 필요합니다. 읽으려는 XML 요소에 대한 태그(xmlTag)도 필요합니다.

구성: 함수 옵션에서 format="xml"를 지정합니다. connection_options에서 paths 키를 사용하여 s3path를 지정합니다. connection_options에서 리더와 S3가 상호 작용하는 방식을 추가로 구성할 수 있습니다. 자세한 내용은 AWS Glue에서 ETL 관련 연결 유형 및 옵션 참조: Amazon S3 연결 format_options에서 rowTag 키를 사용하여 xmlTag를 지정합니다. 리더에서 format_options의 XML 파일을 해석하는 방법을 추가로 구성할 수 있습니다. 자세한 내용은 XML 구성 참조를 참조하십시오.

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

Python

이 예에서는 create_dynamic_frame.from_options 메서드를 사용합니다.

# Example: Read XML from S3 # Set the rowTag option to configure the reader. from awsglue.context import GlueContext from pyspark.context import SparkContext sc = SparkContext.getOrCreate() glueContext = GlueContext(sc) dynamicFrame = glueContext.create_dynamic_frame.from_options( connection_type="s3", connection_options={"paths": ["s3://s3path"]}, format="xml", format_options={"rowTag": "xmlTag"}, )

또한 스크립트(pyspark.sql.DataFrame)에서 DataFrame을 사용합니다.

dataFrame = spark.read\ .format("xml")\ .option("rowTag", "xmlTag")\ .load("s3://s3path")
Scala

이 예에서는 getSourceWithFormat 작업을 사용합니다.

// Example: Read XML from S3 // Set the rowTag option to configure the reader. import com.amazonaws.services.glue.util.JsonOptions import com.amazonaws.services.glue.GlueContext import org.apache.spark.sql.SparkSession val glueContext = new GlueContext(SparkContext.getOrCreate()) val sparkSession: SparkSession = glueContext.getSparkSession object GlueApp { def main(sysArgs: Array[String]): Unit = { val dynamicFrame = glueContext.getSourceWithFormat( formatOptions=JsonOptions("""{"rowTag": "xmlTag"}"""), connectionType="s3", format="xml", options=JsonOptions("""{"paths": ["s3://s3path"], "recurse": true}""") ).getDynamicFrame() }

또한 스크립트(org.apache.spark.sql.DataFrame)에서 DataFrame을 사용합니다.

val dataFrame = spark.read .option("rowTag", "xmlTag") .format("xml") .load("s3://s3path“)

XML 구성 참조

AWS Glue 라이브러리가 format="xml"를 지정한 곳이라면 어디에서든 다음 format_options을 사용할 수 있습니다.

  • rowTag - 파일의 XML 태그를 지정하여 태그를 열로 취급합니다. 열 태그는 자기 복제를 할 수 없습니다.

    • 유형: 텍스트, 필수

  • encoding - 문자 인코딩을 지정합니다. 런타임 환경에서 지원하는 Charset의 이름 또는 별칭이 될 수 있습니다. 인코딩 지원에 대해 구체적으로 보장하지는 않지만 주요 인코딩은 작동할 것입니다.

    • 유형: 텍스트, 기본값: "UTF-8"

  • excludeAttribute - 요소에서 속성을 제외할지 여부를 지정합니다.

    • 유형: 부울, 기본값: false

  • treatEmptyValuesAsNulls - 공백을 null 값으로 취급할지 여부를 지정합니다.

    • 유형: 부울, 기본값: false

  • attributePrefix - 하위 요소 텍스트와 구별하기 위한 속성용 접두사. 이 접두사는 필드 이름으로 사용됩니다.

    • 유형: 텍스트, 기본값: "_"

  • valueTag - 하위 요소가 없는 요소에 속성이 있는 값에 사용되는 태그.

    • 유형: 텍스트, 기본값: "_VALUE"

  • ignoreSurroundingSpaces - 값을 둘러싸는 공백을 무시할지 여부를 지정합니다.

    • 유형: 부울, 기본값: false

  • withSchema - 추론된 스키마를 재정의하려는 상황에서 예상되는 스키마를 포함합니다. 이 옵션을 사용하지 않으면 AWS Glue는 XML 데이터에서 스키마를 유추합니다.

    • 유형: 텍스트, 기본값: 해당 사항 없음

    • 값은 StructType을 나타내는 JSON 객체여야 합니다.

XML 스키마를 수동으로 지정

수동 XML 스키마 예

withSchema 포맷 옵션을 사용하여 XML 데이터에 대한 스키마를 지정하는 예입니다.

from awsglue.gluetypes import * schema = StructType([ Field("id", IntegerType()), Field("name", StringType()), Field("nested", StructType([ Field("x", IntegerType()), Field("y", StringType()), Field("z", ChoiceType([IntegerType(), StringType()])) ])) ]) datasource0 = create_dynamic_frame_from_options( connection_type, connection_options={"paths": ["s3://xml_bucket/someprefix"]}, format="xml", format_options={"withSchema": json.dumps(schema.jsonValue())}, transformation_ctx = "" )