Amazon Athena에서 테이블을 쿼리할 때 ‘FAILED: NullPointerException Name is null’ 오류를 해결하려면 어떻게 해야 합니까?

4분 분량
0

Amazon Athena 테이블을 쿼리할 때 ‘FAILED: NullPointerException Name is Null’ 오류가 발생합니다.

간략한 설명

AWS Glue 데이터 카탈로그에서 쿼리된 테이블에 대해 TableType 속성이 정의되지 않은 경우 이 오류가 발생합니다. TableType 속성은 테이블이 외부 테이블 또는 뷰인지 여부를 정의합니다. 이 속성은 EXTERNAL_TABLE 및 VIRTUAL_VIEW와 같은 값으로 정의할 수 있습니다. SHOW CREATE TABLE 또는 MSCK REPAIR TABLE과 같은 DDL 쿼리를 실행하려는 경우 TableType 속성을 정의해야 합니다.

속성 중 하나로 TableType을 지정하지 않고 AWS CloudFormation 템플릿 또는 AWS Glue API를 사용하여 테이블을 정의한 경우 이 오류가 발생할 수 있습니다.

해결 방법

이 오류를 해결하려면 사용 사례에 따라 다음 중 하나 이상을 수행합니다.

테이블 작성 중 속성 추가

테이블을 만들 때 TableType 속성을 추가합니다.

참고: DDL 문 또는 AWS Glue 크롤러를 사용하여 테이블을 생성하는 경우 TableType 속성이 자동으로 정의됩니다.

CloudFormation 템플릿 또는 AWS Glue API 호출 업데이트

테이블이 TableType을 지정하지 않고 CloudFormation 템플릿 또는 AWS Glue API를 사용하여 정의된 경우 CloudFormation 템플릿 또는 AWS Glue API 호출을 업데이트하여 TableType 속성을 추가합니다.

AWS 명령줄 인터페이스(AWS CLI)를 사용하여 테이블 업데이트

테이블의 TableType 속성을 업데이트하려면 AWS CLI 명령 aws glue update-table을 사용합니다. 이 명령을 실행하려면 전체 테이블 아키텍처를 정의하는 TableInput 객체가 있어야 합니다.

테이블의 TableInput 객체를 얻으려면 aws glue get-table 명령을 실행합니다. 그리고 다음 단계에서 정의한 대로 이 명령의 출력을 업데이트합니다.

참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우 최신 버전의 AWS CLI를 사용하고 있는지 확인하세요.

1.    테이블에서 다음과 유사한 명령을 실행합니다.

aws glue get-table --catalog-id 1111222233334444 --database doc_example_database --name doc_example_table

2.    그러면 다음과 유사한 출력이 표시됩니다.

{
    "Table": {
            "StorageDescriptor": {
            "OutputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
            "SortColumns": [],
            "InputFormat": "org.apache.hadoop.mapred.TextInputFormat",
            "SerdeInfo": {
                    "SerializationLibrary": "org.apache.hadoop.hive.serde2.OpenCSVSerde",
                    "Parameters": {
                    "serialization.format": "1"
                        }
            },
            "Parameters": {
                "separatorChar": ","
            },
            "Location": "s3://doc_example_bucket/doc_example_prefix/",
            "NumberOfBuckets": 0,
            "StoredAsSubDirectories": false,
            "Columns": [
                {
                    "Type": "int",
                    "Name": "id"
                },
                {
                    "Type": "string",
                    "Name": "name"
                }
            ],
            "Compressed": false
        },
        "UpdateTime": 1620508098.0,
        "IsRegisteredWithLakeFormation": false,
        "Name": "doc_example_table",
        "CreatedBy": "arn:aws:iam::1111222233334444:user/Administrator",
        "DatabaseName": "doc_example_database",
        "Owner": "1111222233334444",
        "Retention": 0,
        "CreateTime": 1619909955.0,
        "Description": "tb description"
    }
}

3.    위의 출력에서 UpdateTime, IsRegisteredWithLakeFormation, CreatedBy, DatabaseName 및 CreateTime과 같은 파라미터를 제거합니다. AWS Glue는 이러한 파라미터를 지원하지 않습니다. update-table 명령을 실행할 때 TableInput 속성에 이러한 파라미터를 포함하면 다음 오류가 표시될 수 있습니다.

Parameter validation failed:
Unknown parameter in TableInput: "UpdateTime", must be one of: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters
Unknown parameter in TableInput: "IsRegisteredWithLakeFormation", must be one of: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters
Unknown parameter in TableInput: "CreatedBy", must be one of: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters
Unknown parameter in TableInput: "DatabaseName", must be one of: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters
Unknown parameter in TableInput: "CreateTime", must be one of: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters

4.    파라미터 **"TableType": "EXTERNAL_TABLE"**을 출력에 추가합니다.

5.    출력을 TableInput 파라미터로 사용하여 update-table 명령을 실행합니다.

aws glue update-table --catalog-id 1111222233334444 --database-name doc_example_database --table-input'{
        "StorageDescriptor": {
            "OutputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
            "SortColumns": [],
            "InputFormat": "org.apache.hadoop.mapred.TextInputFormat",
            "SerdeInfo": {
                "SerializationLibrary": "org.apache.hadoop.hive.serde2.OpenCSVSerde",
                "Parameters": {
                    "serialization.format":"1"
                }
            },
            "Parameters": {
                "separatorChar":","
            },
            "Location": "s3://doc_example_bucket/doc_example_prefix/",
            "NumberOfBuckets": 0,
            "StoredAsSubDirectories": false,
            "Columns": [
                {
                    "Type": "int",
                    "Name": "id"
                },
                {
                    "Type": "string",
                    "Name": "name"
                }
            ],
            "Compressed": false
        },
        "Name": "doc_example_table",
        "TableType": "EXTERNAL_TABLE",
        "Owner": "1111222233334444",
        "Retention": 0,
        "Description": "tb description"
    }

위의 명령을 다음과 같이 수정합니다.

  • doc_example_database를 데이터베이스 이름으로 수정
  • doc_example_table을 테이블 이름으로 수정
  • 1111222233334444를 계정 ID로 수정
  • **s3://doc_example_bucket/doc_example_prefix/**를 테이블을 저장한 Amazon Simple Storage Service(Amazon S3) 위치로 수정

위의 명령을 실행 한 후, TableType 파라미터가 업데이트되고, SHOW CREATE TABLE 또는 MSCK REPAIR TABLE과 같은 DDL 쿼리에 성공합니다.


관련 정보

Athena의 문제 해결

AWS 공식
AWS 공식업데이트됨 3년 전