복붙노트

[HADOOP] 하이브를 사용하여 1000 개의 테이블 설명을 얻으려면 어떻게해야합니까?

HADOOP

하이브를 사용하여 1000 개의 테이블 설명을 얻으려면 어떻게해야합니까?

내가 1000 테이블을 가지고, <테이블 이름> 설명을 확인해야합니다; 하나씩. 하나씩 실행하는 대신 하나의 명령으로 "N"개의 테이블을 가져 오는 명령을 하나만 주시겠습니까?

해결법

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

    1.쉘 스크립트를 만들고 매개 변수를 사용하여 호출 할 수 있습니다. 예를 들어 다음 스크립트는 스키마를 받고 스키마의 테이블 목록을 준비하고 DESCRIBE EXTENDED 명령을 호출하고 위치를 추출하며 이름순으로 정렬 된 스키마에서 처음 1000 개의 테이블에 대한 테이블 위치를 인쇄합니다. 이 명령을 수정하여 단일 명령으로 사용할 수 있습니다.

    쉘 스크립트를 만들고 매개 변수를 사용하여 호출 할 수 있습니다. 예를 들어 다음 스크립트는 스키마를 받고 스키마의 테이블 목록을 준비하고 DESCRIBE EXTENDED 명령을 호출하고 위치를 추출하며 이름순으로 정렬 된 스키마에서 처음 1000 개의 테이블에 대한 테이블 위치를 인쇄합니다. 이 명령을 수정하여 단일 명령으로 사용할 수 있습니다.

    #!/bin/bash
    
    #Create table list for a schema (script parameter)
    HIVE_SCHEMA=$1
    echo Processing Hive schema $HIVE_SCHEMA...
    tablelist=tables_$HIVE_SCHEMA
    
     hive -e " set hive.cli.print.header=false; use $HIVE_SCHEMA; show tables;" 1>  $tablelist
    
    #number of tables
    tableNum_limit=1000
    
    #For each table do:
    for table in $(cat $tablelist|sort|head -n "$tableNum_limit") #add proper sorting
     do 
    
     echo Processing table $table ...
    
         #Call DESCRIBE
         out=$(hive client -S -e "use $HIVE_SCHEMA; DESCRIBE EXTENDED $table")
    
         #Get location for example
         table_location=$(echo "${out}" | egrep -o 'location:[^,]+' | sed 's/location://')
         echo Table location: $table_location
         #Do something else here
    
    done 
    
  2. ==============================

    2.메타 스토어 쿼리

    메타 스토어 쿼리

    하이브

    create database my_db_1;
    create database my_db_2;
    create database my_db_3;
    
    create table my_db_1.my_tbl_1 (i int);
    create table my_db_2.my_tbl_2 (c1 string,c2 date,c3 decimal(12,2));
    create table my_db_3.my_tbl_3 (x array<int>,y struct<i:int,j:int,k:int>);
    

    MySQL (Metastore)

    use metastore
    ;
    
    select      d.name              as db_name
               ,t.tbl_name      
               ,c.integer_idx + 1   as col_position
               ,c.column_name
               ,c.type_name
    
    
    from                DBS         as d
    
                join    TBLS        as t
    
                on      t.db_id =
                        d.db_id
    
                join    SDS         as s
    
                on      s.sd_id =
                        t.sd_id        
    
                join    COLUMNS_V2  as c
    
                on      c.cd_id =
                        s.cd_id
    
    where       d.name like 'my\_db\_%'
    
    order by    d.name         
               ,t.tbl_name  
               ,c.integer_idx
    ;
    
    +---------+----------+--------------+-------------+---------------------------+
    | db_name | tbl_name | col_position | column_name |         type_name         |
    +---------+----------+--------------+-------------+---------------------------+
    | my_db_1 | my_tbl_1 |            1 | i           | int                       |
    | my_db_2 | my_tbl_2 |            1 | c1          | string                    |
    | my_db_2 | my_tbl_2 |            2 | c2          | date                      |
    | my_db_2 | my_tbl_2 |            3 | c3          | decimal(12,2)             |
    | my_db_3 | my_tbl_3 |            1 | x           | array<int>                |
    | my_db_3 | my_tbl_3 |            2 | y           | struct<i:int,j:int,k:int> |
    +---------+----------+--------------+-------------+---------------------------+
    
  3. from https://stackoverflow.com/questions/43803834/how-do-we-get-the-1000-tables-description-using-hive by cc-by-sa and MIT license