Software Development/Data Engineering

[Hive] 하이브 테이블에 Spark으로 적재 시, HQL로 읽을 때, 값이 Null로 조회되는 이슈.

루ㅌ 2023. 5. 2. 16:58

Spark 데이터프레임을 하이브 테이블에 저장할 때,

미리 생성한 테이블이 없을 경우(CREATE TABLE로 미리 테이블을 만들지 않았을 경우),

메타데이터를 spark에서 제공하는 값으로 업데이트를 한다.

 

SHOW TABLE TBLPROPERTIES tbl_name;

로 테이블 속성을 확인해보면, 하이브에서 테이블을 만들때와 다른 속성이 조회될 것이다.

업로드된 값을 SparkSQL로는 조회가 잘됐는데, HiveQL로 조회하면, 대부분의 값이 null로 반환되었다.

값이 존재하는 것은 맞는데, Spark으로는 잘 읽어오고 Hive로는 잘 읽어오지 못하는 상황이다.

 

나의 문제와 비슷한 오류를 겪는 글을 발견했다. 발생한 원인은 다음과 같다고 한다.

Hive queries output NULL values on ORC tables created by Spark when column names have upper case letters.[1]
컬럼명이 대문자일때, 하이브로 쿼리 날릴 때, Null을 가져오게 된단다.
원인은 다음과 같다고 한다.

From Hive 2.3.2, a new feature was introduced to match file's schema with the column name equivalence. Due to case-sensitivity issue in column names, the reader was unable to match the columns with ORC schema and printed NULL's. It worked fine before Hive 2.3.2 because the reader matched the file schema using position instead of column names.

하이브 2.3.2부터는 파일의 스키마와 컬럼명이 같아야 된다고 한다. 이때 불일치가 발생해서 값을 Null로 리턴하게 되는 것이다.

제시하는 해결책으로는 orc.force.positional.evolution=true 를 설정하는 것이다.

 

해당 설정은 컬럼명으로 매칭해서 데이터를 가져오는 것이 아니라, 컬럼의 위치를 기반으로 데이터를 가져오는 것이라 한다.

 

[1] https://cloud.google.com/knowledge/kb/hive-queries-outputs-null-s-on-orc-tables-created-by-spark-when-column-names-have-upper-case-letters-000004435