보고서용 질의에서 열 별칭을 한글이나 공백이 들어간 문구로 주고 싶다. 어떤 클러스터에서는 되는데 다른 클러스터에서는 다음이 난다.
Error while compiling statement: FAILED: SemanticException
org.apache.hadoop.hive.ql.parse.ParseException: line 1:23 cannot recognize input near ...
Hive 는 표준 SQL 의 큰따옴표가 아니라 MySQL 계열의 backtick(`)으로 식별자를 감싼다. 큰따옴표는 문자열 리터럴로 해석되므로 별칭 자리에 쓰면 오류가 나거나 엉뚱하게 동작한다.
SELECT cnt AS `주문 건수`, amt AS `총 금액`
FROM sales_summary;
Hive 는 UTF-8 을 쓰므로 한글 별칭 자체는 문제가 되지 않는다. 걸리는 것은 공백과 특수문자이고, 그것을 허용할지는 아래 설정이 정한다.
이 설정이 backtick 의 의미를 바꾼다. 값이 두 가지다.
| 값 | backtick 의 뜻 |
|---|---|
column (기본값) |
감싼 내용을 그대로 식별자로 본다. 공백·특수문자 허용 |
none |
감싼 내용을 정규식으로 본다. `(ds)?+.+` 같은 열 선택에 쓰인다 |
none 으로 설정된 클러스터에서 `주문 건수` 를 쓰면 정규식으로 해석하려다 실패한다. 같은 질의가 클러스터마다 다르게 동작하는 이유가 대개 이것이다.
지금 값을 확인하고 세션에서 바꿀 수 있다.
SET hive.support.quoted.identifiers;
SET hive.support.quoted.identifiers=column;
영구 적용은 hive-site.xml 이나 Cloudera Manager 의 HiveServer2 안전 밸브에 넣는다. HiveServer2 재기동이 필요하다.
<property>
<name>hive.support.quoted.identifiers</name>
<value>column</value>
</property>
질의 결과 열의 별칭은 그 질의의 결과 스키마에만 존재한다. 메타스토어에 기록되지 않으므로 다음 질의에서 이어 쓸 수 없고, 다른 도구가 조회할 수도 없다.
이름을 남기려면 뷰나 테이블로 만든다. 이때는 그 이름이 실제 열 이름이 되므로 제약이 더 강해진다.
CREATE VIEW v_sales AS
SELECT cnt AS order_count, amt AS total_amount FROM sales_summary;
별칭과 달리 실제 열 이름에 공백이나 한글을 넣으면 다음 문제가 생긴다.
Parquet · ORC 같은 파일 형식은 열 이름에 제약이 있다. 공백이나 일부 특수문자가 들어가면 쓰기 단계에서 실패한다.
Impala 는 Hive 보다 식별자 규칙이 엄격하다. Hive 로 만든 테이블을 Impala 로 못 읽는 상황이 생긴다.
Spark · Trino 등 다른 엔진이 같은 테이블을 볼 때 따옴표 문자가 달라 질의를 그대로 옮기지 못한다.
실제 이름은 영문 소문자와 밑줄로 두고, 사람이 읽을 이름은 조회 시점의 별칭이나 BI 도구의 표시 이름으로 붙이는 것이 안전하다.
hive.support.quoted.identifiers 는 Hive 0.13 에서 들어왔고 기본값이 column 이다. 그보다 오래된 계열에서는 backtick 안에 공백을 넣을 수 없었다. 다만 실제로 마주치는 차이는 버전보다 배포판이 기본값을 바꿔 두었는지에서 온다. 오류가 나면 버전을 탓하기 전에 설정값을 먼저 읽는다.
SELECT version();
SET hive.support.quoted.identifiers;
특정 버전 아래에서는 backtick 을 써도 반드시 실패한다는 식의 경계선은 확인되지 않았다. (확인 필요)
SELECT 목록에서 정의한 별칭은 같은 질의의 WHERE 에서 쓸 수 없다. GROUP BY · ORDER BY 에서는 쓸 수 있다.
Beeline 으로 결과를 파일로 내릴 때 별칭에 공백이 있으면 구분자와 섞여 후속 처리가 깨질 수 있다. 출력 형식을 CSV2 로 두고 따옴표 처리를 확인한다.
SET 을 다루는 방법.