1. 문제 상황

- AWS Athena에서 s3에 저장된 parquet 파일로 table을 만들었다.

- 생성은 문제없이 됐으나 "TYPE_MISMATCH: Unable to read parquet data. This is most likely caused by a mismatch between the parquet and metastore schema'"라는 에러 메세지가 발생

 

2. 해결 방법

- CREATE TABLE 관련 AWS 문서를 확인했다.

https://docs.aws.amazon.com/ko_kr/athena/latest/ug/create-table.html

 

CREATE TABLE - Amazon Athena

비 문자열 데이터 유형은 Athena에서 string으로 캐스팅할 수 없습니다. 대신 varchar로 캐스팅합니다.

docs.aws.amazon.com

- date 항목에 아래와 같은 내용이 있었다.

- parquet에 1970-01-01 보다 작은 날짜가 있는지 확인하고 그보다 작은 날짜는 수정했다.

parquet파일을 열어 확인해보니 birth_date에 1970년 보다 작은 날짜가 있다

 

3. 결론

- 날짜 형식을 쓰려면 1970-01-01보다 작은 날짜가 있는지 확인해야 한다.

- timestamp 형식을 쓰는 경우 1970-01-01 보다 큰 날짜 값만 사용하는 것을 상정해야 한다.

- 그보다 작은 날짜를 쓸 일이 있다면 string을 사용하여 날짜를 저장하고 사용하는 것이 좋을 것으로 보인다.

- 예를 들어 string으로 하는 경우 20230810 같은 방식으로 저장하면 된다.

'AWS 문제 해결 기록 > Athena' 카테고리의 다른 글

Only one sql statement is allowed.  (0) 2023.08.23

1. 문제 상황

- 기본 값을 사용하여 도커를 설치하는 경우 도커 컨테이너의 network는 172.17.xxx.xxx 대역으로 생성된다.

- 도커 기반의 서비스 구성에서 IP가 172.17.xxx.xxx인 곳에 접근하려는 경우 도커 브릿지 네트워크 대역폭과의 충돌이 문제가 되는 경우가 있다.

 

 

 

2. 해결 방안

- 기본으로 설정된 대역폭을 임의로 변경하여 문제를 해결한다.

- 기본적인 IP 대역폭을 변경하는 방법은 매우 쉽다.

- 아래의 설명대로 /etc/docker/daemon.json 파일을 설정을 변경하면 된다.

https://docs.docker.com/network/bridge/#use-the-default-bridge-network

 

Use bridge networks

 

docs.docker.com

 

 

 

3. 변경 과정

- /etc/docker/daemon.json 파일이 없는 경우에는 생성하면 된다.

- 일반적인 설정 값은 기본 값을 써도 무방하므로 아래와 같이 bip만 변경하자.

- ip는 예시 이므로 임의로 다른 것을 지정해도 된다.

{
  "bip": "192.168.1.1/24"
}

- 이후 도커 서비스를 restart하면 끝이고, 기존에 기본 네트워크를 사용하던 컨테이너들은 자동으로 새로운 대역폭으로 ip 생성된다.

1. 변수의 타입

- 변수는 크게 기본형과 참조형이 있다.

  • 기본형 : boolean, char, byte, short, int, long, float, double로 계산을 위한 실제 값을 저장하는 형식
  • 참조형 : 어떤 값이 저장되어 있는 메모리 주소를 저장. 기본형을 제외한 모든 형식

- 참조형 변수를 선언할때는 변수의 타입으로 클래스의 이름을 사용한다.

Date today = new Date(); // Date객체를 생성하고 today에 그 주소를 저장한다.

 

 

 

2. 기본형

- 기본형은 크게 4가지로 구분할 수 있다.

  • 논리형
    • boolean : true, false로 논리식 계산에 사용
  • 문자형
    • char : 문자를 저장하는데 사용
  • 정수형
    • byte, short, int, long : 정수를 저장하는데 사용. 주로 int를 사용하고 byte는 2진수, short는 C언어와 호환을 위해 사용한다.
  • 실수형
    • float, double : 실수를 저장하는데 사용. 주로 double이 사용된다.

- boolean은 다른 기본형과 변환과 연산이 불가능 하다.

- 다른 기본형은 서로 변환과 연산이 가능하다.

- 정수형이나 실수형은 사용할 값의 범위에 차이가 있는 것이므로 확인후 사용하자.

- 주로 boolean, char, int, double을 사용한다고 생각하면 된다.

 

 

 

3. 상수

- 상수는 일반 변수와 같은 방식으로 선언할 수 있지만, 그 값을 변경할 수 없다.

- 상수를 선언하는 방법은 변수 타입 앞에 final을 붙이면 된다.

- 상수는 반드시 선언과 동시에 초기화해야하고, 그 이후에는 값 변경이 불가능 하다.

class ConstantEx1 {
    public static void main(String[] args) {
        // 아래의 주석을 해제하고 실행하면 선언만 해서 에러가 발생하는 것을 볼 수 있다.
        // final int MY_CONSTANT;
        final int MY_CONSTANT = 100;
        System.out.println(MY_CONSTANT);
        
        // 아래의 주석을 해제하고 실행하면 MY_CONSTANT를 변경할 수 없다는 에러가 발생한다.
        // MY_CONSTANT = 200;
    }
}

 

 

 

4. 리터럴

- 변수가 가지고 있는 값 자체를 말하는 것이 리터럴이다.

- 예를 들면 final MY_NUM = 100; 의 리터럴은 100이다.

- 리터럴에는 접미사를 붙여서 구분한다.

class Literal {
    public static void main(String[] args) {
        int myInt = 100;
        long myLong = 100L;
        // _을 구분자로 사용할 수 있다. 결론적으로 100000000이 할당된다.
        long myLong2 = 100_000_000L;

        float myFloat = 1.23f;
        double myDouble = 1.23d;
        // d는 생략할 수 있다.
        double myDouble2 = 1.23;

        System.out.println(myLong2);
    }
}

 

+ Recent posts