Hive는 join on like 비등가join 연결을 지원하지 않으며 LOCATE()로 대체할 수 있습니다.

4695 단어 hiveSQL
문제.
일반적으로 우리는 연결을 쓸 때join...on tb1.a = tb2.b,like의 글씨를 쓸 때도 있다.MySQL 및 Oracle 모두 지원join...on...like:
SELECT *  
FROM table1  
LEFT JOIN table2  
ON table1.xxx LIKE CONCAT('%',table2.yyy,'%') 

그러나 Hive는 like와 같은 비등치 연결을 지원하지 않아서 오류가 발생할 수 있습니다.
해결 방법
법일
인터넷에서 검색하는 방법:
SELECT *  
FROM table1  
LEFT JOIN table2  
ON(TRUE)  
WHERE LOCATE(table2.yyy,table1.xxx)

그러나 여기에서 오류 보고가 ON (TRUE) 쓰기를 지원하지 않습니다. 아마도 하이브 버전의 문제일 것입니다. 그래서 시도법 2.
법2
SELECT *  
FROM table1  
LEFT JOIN table2  
ON LOCATE(table2.yyy,table1.xxx)>0

모르는LOCATE() 함수가 있을 수 있습니다. 간단하게 말하자면 LOCATE(a, b) 기능은 a가 b에 있는 위치를 찾는 것입니다. 찾으면 위치로 돌아가는 것입니다.못 찾으면 0으로 돌아갑니다.예:
select LOCATE('20','222000') 

결과 출력: 3
select LOCATE('2333','222000') 

출력 결과: 0 따라서LOCATE(table2.yyy,table1.xxx)>0 yy가 xxx에 존재한다는 것을 나타낸다.'yy like x xx%'를 대체할 수 있다.
확장 방법
yyy로 시작하는 것만 일치시키려면, 원래 sql은 다음과 같습니다.
SELECT *  FROM table1  LEFT JOIN table2  
ON table1.xxx like concat(table2.yyy,'%')

Hive는 다음과 같이 재정의할 수 있습니다.
SELECT *  FROM table1  LEFT JOIN table2  
ON LOCATE(table2.yyy,table1.xxx) = 1

또는 문자열을 잘라내는 방법을 사용할 수 있습니다.
SELECT *  FROM table1  LEFT JOIN table2  
ON  substr(table1.xxx,1,length(table2.yyy)) = table2.yyy

좋은 웹페이지 즐겨찾기