내용으로 건너뛰기

AWS Glue에서 “Unable to infer schema” 오류를 해결하려면 어떻게 해야 합니까?

3분 분량
0

Amazon Simple Storage Service(Amazon S3)에 저장한 Parquet 또는 ORC 파일을 처리하기 위해 AWS Glue 작업을 실행할 때 “Unable to infer schema” 오류가 표시됩니다.

간략한 설명

Parquet 또는 ORC 파일은 Hive 스타일의 key=value 파티션 경로 형식을 따라야 합니다. 파일이 계층적 경로 구조를 대신 사용하는 경우 AWS Glue는 스키마를 이해하지 못해 실패합니다.

예를 들어, AWS Glue 작업에서 s3://s3-bucket/parquet-data/ 파일을 처리하는 경우 파일은 다음과 같은 파티셔닝된 형식을 사용해야 합니다.

s3://s3-bucket/parquet-data/year=2018/month=10/day=10/file1.parquet

파일이 다음과 같이 파티셔닝되지 않은 형식을 사용하는 경우 AWS Glue 작업이 실패합니다.

s3://s3-bucket/parquet-data/year/month/day/file1.parquet

해결 방법

AWS Glue에서 “Unable to infer schema” 오류를 해결하려면 사용 사례에 따라 다음 방법 중 하나를 사용하십시오.

데이터 재구성

파일을 새 S3 버킷에 복사하고 Hive 스타일의 파티셔닝된 경로를 사용합니다. 그런 다음 작업을 실행합니다.

파티션 열 이름을 별표로 바꾸기

데이터를 재구성할 수 없는 경우 Amazon S3에서 직접 DynamicFrame을 만듭니다. 파티션 열 이름 대신 별표(*)를 사용합니다. AWS Glue는 DynamicFrame의 데이터만 포함하며, 파티션 열은 포함하지 않습니다.

예를 들어 s3://s3-bucket/parquet-data/year/month/day/files.parquet 파일 경로를 사용하여 S3 버킷에 파일을 저장하는 경우 다음 DynamicFrame을 사용합니다.

dynamic_frame0 = glueContext.create_dynamic_frame_from_options(
    's3',
    connection_options={'paths': ['s3://s3-bucket/parquet-data/*/*/*']},
    format='parquet',
    transformation_ctx='dynamic_frame0'
)

맵 클래스 변환을 사용하여 파티션 열 추가

DynamicFrame에 파티션 열을 포함하려면 데이터를 DataFrame으로 읽고 Amazon S3 파일 경로에 열을 추가합니다. 그런 다음 맵 클래스 변환을 적용합니다.

코드 예시:

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
from awsglue.dynamicframe import DynamicFrame
from pyspark.sql.functions import input_file_name

args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

df = spark.read.parquet("s3://s3-bucket/parquet-data/*/*/*")
modified_df = df.withColumn('partitions_column', input_file_name())
dyf_0 = DynamicFrame.fromDF(modified_df, glueContext, "dyf_0")

def modify_col(x):
    if x['partitions_column']:
        new_columns = x['partitions_column'].split('/')
        x['year'], x['month'], x['day'] = new_columns[4], new_columns[5], new_columns[6]
        del x['partitions_column']
    return x

modified_dyf = Map.apply(dyf_0, f=modify_col)

datasink2 = glueContext.write_dynamic_frame.from_options(
    frame=modified_dyf,
    connection_type="s3",
    connection_options={
        "path": "s3://my-output-bucket/output/",
        "partitionKeys": ["year", "month", "day"]
    },
    format="parquet",
    transformation_ctx="datasink2"
)

참고: S3 경로 예시를 해당되는 S3 경로로 바꾸고 사용 사례에 맞춰 파티션 열을 사용자 지정합니다.

존재하지 않는 파일 또는 접두사 해결

경로에 파일이 없는 경우 파일을 삭제 또는 보관했는지 확인하십시오. 파일이 다른 접두사를 사용하는 경우 AWS Glue 스크립트의 connection_options 파라미터가 올바른 경로를 가리키도록 업데이트하십시오. 또한 카탈로그 테이블이 누락되거나 오래된 S3 위치를 참조하는지 확인하십시오. 테이블이 누락된 파일을 가리키는 경우 처리할 데이터가 없으므로 작업이 실패합니다.

작업 북마크 파라미터가 있는 작업에서 오래된 파일을 스캔할 때 발생하는 문제 해결

작업 북마크를 사용하면 AWS Glue는 이전에 처리된 파일을 추적하고 이전 타임스탬프가 있는 파일은 건너뜁니다. 작업에서 적합한 새 파일을 찾지 못하면 처리할 데이터가 없으므로 작업이 실패합니다.

이 문제를 해결하려면 다음 작업을 수행하십시오.

  • 파일의 수정된 타임스탬프가 예상 범위 내에 있는지 확인합니다.
  • 북마크를 끄고 모든 파일을 다시 처리합니다.
  • AWS Glue가 파일을 새 파일로 감지하여 다음 실행에 포함하도록 파일의 이름을 바꾸거나 마지막으로 수정된 최신 타임스탬프를 포함하도록 업데이트하십시오.

관련 정보

AWS Glue에서 ETL 출력을 위한 파티션 관리

AWS 공식업데이트됨 일 년 전