Cloudera CDH/CDP 및 Hadoop EcoSystem, Semantic IoT등의 개발/운영 기술을 정리합니다. gooper@gooper.com로 문의 주세요.
#!/bin/bash
##########################################
# Impala View - Physical Table 매핑 스크립트
##########################################
# === [환경 설정] ===
IMPALA_HOST="your_impala_host" # Impala 데몬 호스트
IMPALA_PORT="21050" # Impala 포트 (기본값: 21050)
DATABASE="your_database" # 대상 데이터베이스
OUTPUT_FILE="view_table_mapping.txt" # 결과 출력 파일명
# === [오류 처리 함수] ===
error_exit() {
echo "ERROR: $1" >&2
exit 1
}
# === [필수 명령어 확인] ===
command -v impala-shell >/dev/null 2>&1 || error_exit "impala-shell이 설치되어 있지 않습니다."
command -v awk >/dev/null 2>&1 || error_exit "awk가 설치되어 있지 않습니다."
# === [Impala 쿼리 실행 함수] ===
execute_impala_query() {
impala-shell -i "${IMPALA_HOST}:${IMPALA_PORT}" -d "$DATABASE" -q "$1" --quiet -B 2>/dev/null
}
# === [View DDL에서 물리 테이블 추출 함수] ===
extract_tables() {
local DDL="$1"
DDL=$(echo "$DDL" | tr '\n' ' ' | sed 's/[[:space:]]\+/ /g')
TABLES=$(echo "$DDL" | awk -v RS=' ' '
BEGIN { IGNORECASE=1 }
/FROM|JOIN/ {
getline next_word
if (next_word !~ /^(SELECT|WHERE|GROUP|ORDER|LIMIT|ON|USING|,|\(|\)|$)/) {
if (next_word ~ /\(/) next
split(next_word, arr, ".")
table = (length(arr) > 1) ? arr[1]"."arr[2] : arr[1]
gsub(/[[:space:]]+AS[[:space:]]+[a-zA-Z0-9_]+/, "", table)
gsub(/[^a-zA-Z0-9_\.]/, "", table)
if (table && table !~ /^[0-9]/) print table
}
}
/WITH/ {
while (getline > 0) {
if ($0 ~ /AS[[:space:]]*\(/) break
if ($0 ~ /^[a-zA-Z0-9_\.]+/) {
gsub(/[^a-zA-Z0-9_\.]/, "", $0)
if ($0) print $0
}
}
}
' | grep -v -E "^(SELECT|WHERE|GROUP|ORDER|LIMIT|AS|ON|USING)$" | sort -u)
echo "$TABLES"
}
# === [출력 파일 초기화] ===
echo "View와 물리 테이블 매핑 정보" > "$OUTPUT_FILE"
echo "실행 시간: $(date)" >> "$OUTPUT_FILE"
echo "----------------------------------------" >> "$OUTPUT_FILE"
# === [모든 View 목록 가져오기] ===
echo "View 목록을 조회 중..."
VIEWS=$(execute_impala_query "SHOW VIEWS;" | grep -v "^$" || error_exit "View 목록 조회 실패")
# View가 없는 경우 처리
if [ -z "$VIEWS" ]; then
echo "데이터베이스 $DATABASE에 View가 존재하지 않습니다." >> "$OUTPUT_FILE"
exit 0
fi
# === [각 View의 물리 테이블 추출 및 기록] ===
echo "View 정의 분석 중..."
for VIEW_NAME in $VIEWS; do
echo "처리 중: $VIEW_NAME"
VIEW_DDL=$(execute_impala_query "SHOW CREATE VIEW $VIEW_NAME;")
if [ $? -ne 0 ]; then
echo "$VIEW_NAME: 정의 추출 실패" >> "$OUTPUT_FILE"
continue
fi
TABLES=$(extract_tables "$VIEW_DDL")
echo "View: $VIEW_NAME" >> "$OUTPUT_FILE"
if [ -n "$TABLES" ]; then
echo "Physical Tables:" >> "$OUTPUT_FILE"
echo "$TABLES" | while read TABLE; do
echo " - $TABLE" >> "$OUTPUT_FILE"
done
else
echo "Physical Tables: (추출 실패 - 복잡한 쿼리일 가능성)" >> "$OUTPUT_FILE"
fi
echo "----------------------------------------" >> "$OUTPUT_FILE"
done
# === [완료 메시지] ===
echo "처리 완료. 결과는 $OUTPUT_FILE에 저장되었습니다."