복붙노트

[HADOOP] 덮어 쓰기 디렉토리 삽입에 대한 Hive 사례 설명

HADOOP

덮어 쓰기 디렉토리 삽입에 대한 Hive 사례 설명

다음 논리를 사용하여 HQL 스크립트를 실행하려고하면 오류가 발생합니다.

ParseException line 4:0 cannot recognize input near 'CASE' 'WHEN' 'mytable' in serde properties specification 

스크립트 로직

INSERT OVERWRITE DIRECTORY '/example/path'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
CASE WHEN ${hiveconf:tbl_name}='mytable'
THEN SELECT * FROM ${hiveconf:tbl_name} LEFT OUTER JOIN ...;
WHEN ${hiveconf:tbl_name}='mytable2'
THEN SELECT * FROM ${hiveconf:tbl_name} LEFT OUTER JOIN ...;
ELSE THEN
END

INSERT OVERWRITE DIRECTORY에 전달할 tbl_name 매개 변수의 값을 기반으로 select 문을 올바르게 지정하려면 어떻게해야합니까?

업데이트 1 : 다음과 같이 수정하는 경우 :

SELECT CASE WHEN ${hiveconf:tbl_name}='mytable'
THEN * FROM WHEN ${hiveconf:tbl_name}='mytable'
WHEN ${hiveconf:tbl_name}='mytable2'
THEN * FROM ${hiveconf:tbl_name} LEFT OUTER JOIN ...;
ELSE THEN
END

다음과 같은 오류가 발생합니다.

FAILED: ParseException line 9:9 cannot recognize input near '*' 'FROM' 'mytable' in expression specification

업데이트 2 : 다음과 같이 수정하는 경우 :

SELECT * CASE WHEN ${hiveconf:tbl_name}='mytable'
THEN FROM WHEN ${hiveconf:tbl_name}='mytable'
WHEN ${hiveconf:tbl_name}='mytable2'
THEN FROM ${hiveconf:tbl_name} LEFT OUTER JOIN ...;
ELSE THEN
END

다음과 같은 오류가 발생합니다.

FAILED: ParseException line 8:9 Failed to recognize predicate 'CASE'. Failed rule: 'regularBody' in statement

해결법

  1. ==============================

    1.빠른 해결책은 UNION ALL + WHERE를 사용하는 것입니다. 이처럼 :

    빠른 해결책은 UNION ALL + WHERE를 사용하는 것입니다. 이처럼 :

    insert overwrite directory
    ...
    select * from mytable where '${hiveconf:tbl_name}'='mytable'
    union all
    select * from mytable2 where '${hiveconf:tbl_name}'='mytable2'
    

    각 선택에 조인을 추가하십시오.

  2. from https://stackoverflow.com/questions/37595532/hive-case-statement-for-insert-overwrite-directory by cc-by-sa and MIT license