메뉴 건너뛰기

test

추출3

2025.03.05 17:08

관리자 조회 수:3

#!/bin/bash # 스크립트 설정 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 } # 테이블명 추출 함수 (복잡한 쿼리 지원) extract_tables() { local DDL="$1" # 쿼리를 단일 라인으로 변환하고 불필요한 공백 정리 DDL=$(echo "$DDL" | tr '\n' ' ' | sed 's/[[:space:]]\+/ /g') # FROM, JOIN, WITH(CTE)에서 테이블명 추출 TABLES=$(echo "$DDL" | awk -v RS=' ' ' BEGIN { IGNORECASE=1 } # FROM/JOIN 절 처리 /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 } } # CTE (WITH 절) 처리 /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의 생성 쿼리 가져오기 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에 저장되었습니다."

위로