Hive 큰따옴표 포함된 데이터 업로드시 Null로 저장되는 현상 해결

    Hive의 기본 설정으로는 큰따옴표가 포함되어 있는 데이터는 읽을 수 없기 때문에 테이블에는 null로 저장됩니다. 예를 들어 csv 파일을 테이블에 업로드하려고 하는데 무수히 많은 로우에 큰따옴표가 불규칙하게 들어있고 해당 데이터를 Hive에 올리려고 할 때 이러한 문제가 생기면 난처한 상황 아래 놓이게 되는 것입니다.

     

    물론 원천 데이터로 사용되는 csv 파일의 큰따옴표를 모두 제거할 수 있다면 쉽게 해결될 수 있겠지만, 그렇지 않은 경우에는 별도의 방법을 통해서 처리해야 합니다. 그리고 이때 필요한 것이 Serde(서데)를 사용하는 것입니다.

    Serde란 무엇인가?(+Serde 적용 예시)

    Hive는 파일 내 데이터를 읽을 때 Avro, ORC, Parquet, CSV 등의 파일포맷을 사용하고 역직렬화(Deserializer)를 통해 파일 내 데이터를 Hive 테이블 포맷에 맞도록 변환하는 과정을 거칩니다. Serde는 Hive가 해당하는 파일 포맷의 데이터를 제대로 해석할 수 있도록 하는 일종의 라이브러리로 Serde를 다운로드하여 적용하면 해당 파일 포맷에 대한 추가적인 설정을 걸어서 데이터를 세밀하게 파싱 하는 것이 가능하게 됩니다.

     

    예를 들어 csv 파일포맷에 대한 Serde를 적용하기 위해서는 우선 아래의 사이트에서 csv-serde-1.1.3-1.2.1-all.jar 파일을 다운로드하여야 합니다.

     

    https://github.com/ogrodnek/csv-serde

     

    다운로드 받은 이후에는 파일을 환경에 업로드 한 이후 아래의 명령어로 적용시킵니다.

     

    add jar path/to/csv-serde.jar;

     

     이렇게 serde를 적용하고 나면 테이블의 포맷을 CSVSerde로 특정해서 생성할 수 있게 됩니다.

     

    create table my_table(col1 bigint, col2 string, ...)
      row format serde 'com.bizo.hive.serde.csv.CSVSerde'
      stored as textfile
    ;
     
    --기존에 생성된 테이블의 파일포맷을 변경하는 경우
    ALTER TABLE my_table SET SERDE 'com.bizo.hive.serde.csv.CSVSerde';
     

     

     

    큰따옴표를 파싱하고 싶은 경우에는 아래와 같이 테이블을 설정해서 생성하면 됩니다. 이렇게 CSVSerde가 적용된 테이블에 큰따옴표가 포함된 데이터가 저장되어 있는 csv파일을 업로드하면 원하는 결과를 얻을 수 있습니다.

     

    CREATE TABLE my_table(col1 bigint, col2 string,..)
    ROW FORMAT SERDE 'com.bizo.hive.serde.csv.CSVSerde'
    WITH SERDEPROPERTIES (
       "separatorChar" = ",",
       "quoteChar"     = "\""
    )  
    STORED AS TEXTFILE 
     
     

     

    Hue를 사용하는 환경에서 Serde를 적용하는 방법은 아래의 링크에 자세한 동영상과 함께 설명되어 있으니 참고하면 금방 적용할 수 있습니다.

     

    https://gethue.com/hadoop-tutorial-create-hive-tables-with-headers-and/

     

    Serde 사용하지 않고 큰따옴표 적재하는 방법

    위에서 언급한 Serde를 적용하는 것이 어려운 상황이라면, 큰따옴표를 처리할 수 있는 다른 방법을 생각해야 합니다. csv 파일에 있는 큰따옴표를 제거하는 것이 가장 먼저 생각할 수 있는 단순한 방법이 될 수 있겠지만 여의치 않은 상황이라면 우선 테이블의 컬럼 타입을 string 타입으로 생성해서 큰따옴표가 포함된 데이터를 임시로 업로드 한 다음 정규식을 사용해 큰따옴표를 처리하는 방법이 있습니다.

     

    큰따옴표를 처리하는 정규식 함수 자체는 어려운 것이 아니라서 아래와 같은 구문을 응용해서 작성하면 큰따옴표를 제거하면서 대상 테이블로 데이터를 옮겨 적재할 수 있습니다.

     

    insert into my_table2 select REGEXP_REPLACE(col1, '"''')
    , REGEXP_REPLACE(col2, '"''') from my_table;
     

     

    이렇게 큰따옴표가 포함된 데이터를 hive에 업로드할 때 null로 입력되는 현상을 해결하는 방법을 살펴보았는데, 혹시 이외에도 더 효과적으로 처리할 수 있는 방법에 대해 알고 계시다면 언제든지 댓글로 공유 부탁드립니다.

    댓글(2)

    재테크에 대한 모든 정보 다니엘의 라이브러리