Impala 에는 두 테이블의 스키마를 비교하는 SQL 이 없다. INFORMATION_SCHEMA 도 없다. 다른 DBMS 의 방식을 그대로 가져오면 실패한다.
가장 확실한 방법은 DDL 을 뽑아 텍스트로 비교하는 것이다. 컬럼뿐 아니라 파티션 정의 · 파일 포맷 · LOCATION · TBLPROPERTIES 까지 한 번에 보인다.
impala-shell -i coord:21050 --ssl -k -B -q "SHOW CREATE TABLE db.stop_def" > /tmp/a.sql
impala-shell -i coord:21050 --ssl -k -B -q "SHOW CREATE TABLE db.stop_def_test" > /tmp/b.sql
diff -u /tmp/a.sql /tmp/b.sql
컬럼 목록만 보면 될 때는 DESCRIBE 결과를 비교한다.
impala-shell -i coord:21050 --ssl -k -B -q "DESCRIBE db.stop_def" | awk '{print $1, $2}' | sort > /tmp/a.txt
impala-shell -i coord:21050 --ssl -k -B -q "DESCRIBE db.stop_def_test" | awk '{print $1, $2}' | sort > /tmp/b.txt
diff -u /tmp/a.txt /tmp/b.txt
-B 는 구분선 없는 출력이라 비교하기 좋다.
메타스토어 RDBMS 에 직접 붙을 수 있다면 SQL 로 차이를 낼 수 있다. 읽기 전용 계정으로만 접근하고 절대 수정하지 않는다.
SELECT c.COLUMN_NAME, c.TYPE_NAME, t.TBL_NAME
FROM COLUMNS_V2 c
JOIN SDS s ON c.CD_ID = s.CD_ID
JOIN TBLS t ON t.SD_ID = s.SD_ID
JOIN DBS d ON t.DB_ID = d.DB_ID
WHERE d.NAME = 'db' AND t.TBL_NAME IN ('stop_def', 'stop_def_test')
ORDER BY t.TBL_NAME, c.INTEGER_IDX;
파티션 컬럼은 PARTITION_KEYS 에 따로 있으므로 함께 봐야 전체가 된다.