복붙노트

[HADOOP] 하이브, 어떻게 모든 데이터베이스의 테이블 열을 검색합니까?

HADOOP

하이브, 어떻게 모든 데이터베이스의 테이블 열을 검색합니까?

이 SQL 요청에 해당하는 하이브를 작성하고 싶습니다.

select * from information_schema.columns where table_schema='database_name'

해결법

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

    1.하이브 메타 데이터를 반환하는 쿼리를 실행할 수있는 기능을 원한다면 MySQL을 사용하여 하이브 메타 스토어를 설정할 수 있습니다. 하이브에 사용 된 메타 데이터는 MySQL의 특정 계정에 저장됩니다.

    하이브 메타 데이터를 반환하는 쿼리를 실행할 수있는 기능을 원한다면 MySQL을 사용하여 하이브 메타 스토어를 설정할 수 있습니다. 하이브에 사용 된 메타 데이터는 MySQL의 특정 계정에 저장됩니다.

    CREATE USER 'hive'@ 'metastorehost'IDENTIFIED BY 'mypassword'를 수행하여 하이브 용 MySQL 사용자를 만들어야합니다.

    그런 다음 찾고있는 정보가있는 COLUMNS_VS와 같은 테이블을 찾을 수 있습니다.

    모든 테이블의 모든 열을 검색하는 쿼리 예는 다음과 같습니다. SELECT COLUMN_NAME, TBL_NAME FROM COLUMNS_V2 c JOIN TBLS a ON c.CD_ID = a.TBL_ID

    또는 WebHCat에 대한 REST 호출을 통해이 정보에 액세스 할 수 있습니다. 자세한 정보는 wiki를 참조하십시오.

  2. ==============================

    2.이것은 HiveMetaStoreClient를 연결하는 한 방법이며 getTableColumnsInformation 메서드를 사용하여 열을 가져올 수 있습니다.

    이것은 HiveMetaStoreClient를 연결하는 한 방법이며 getTableColumnsInformation 메서드를 사용하여 열을 가져올 수 있습니다.

    이 클래스에서는 열과 함께 파티션과 같은 다른 모든 정보를 추출 할 수 있습니다. pls 예제 클라이언트 및 예제 메서드를 참조하십시오.

    import org.apache.hadoop.hive.conf.HiveConf;
    
    // test program
    public class Test {
        public static void main(String[] args){
    
            HiveConf hiveConf = new HiveConf();
            hiveConf.setIntVar(HiveConf.ConfVars.METASTORETHRIFTCONNECTIONRETRIES, 3);
            hiveConf.setVar(HiveConf.ConfVars.METASTOREURIS, "thrift://host:port");
    
            HiveMetaStoreConnector hiveMetaStoreConnector = new HiveMetaStoreConnector(hiveConf);
            if(hiveMetaStoreConnector != null){
                System.out.print(hiveMetaStoreConnector.getAllPartitionInfo("tablename"));
            }
        }
    }
    
    
    // define a class like this
    
    import com.google.common.base.Joiner;
    import com.google.common.collect.Lists;
    import org.apache.hadoop.hive.conf.HiveConf;
    import org.apache.hadoop.hive.metastore.HiveMetaStoreClient;
    import org.apache.hadoop.hive.metastore.api.FieldSchema;
    import org.apache.hadoop.hive.metastore.api.MetaException;
    import org.apache.hadoop.hive.metastore.api.Partition;
    import org.apache.hadoop.hive.metastore.api.hive_metastoreConstants;
    import org.apache.hadoop.hive.ql.metadata.Hive;
    import org.apache.thrift.TException;
    import org.joda.time.DateTime;
    import org.joda.time.format.DateTimeFormatter;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    public class HiveMetaStoreConnector {
        private HiveConf hiveConf;
        HiveMetaStoreClient hiveMetaStoreClient;
    
        public HiveMetaStoreConnector(String msAddr, String msPort){
            try {
                hiveConf = new HiveConf();
                hiveConf.setVar(HiveConf.ConfVars.METASTOREURIS, msAddr+":"+ msPort);
                hiveMetaStoreClient = new HiveMetaStoreClient(hiveConf);
            } catch (MetaException e) {
                e.printStackTrace();
                System.err.println("Constructor error");
                System.err.println(e.toString());
                System.exit(-100);
            }
        }
    
        public HiveMetaStoreConnector(HiveConf hiveConf){
            try {
                this.hiveConf = hiveConf;
                hiveMetaStoreClient = new HiveMetaStoreClient(hiveConf);
            } catch (MetaException e) {
                e.printStackTrace();
                System.err.println("Constructor error");
                System.err.println(e.toString());
                System.exit(-100);
            }
        }
    
        public String getAllPartitionInfo(String dbName){
            List<String> res = Lists.newArrayList();
            try {
                List<String> tableList = hiveMetaStoreClient.getAllTables(dbName);
                for(String tableName:tableList){
                    res.addAll(getTablePartitionInformation(dbName,tableName));
                }
            } catch (MetaException e) {
                e.printStackTrace();
                System.out.println("getAllTableStatistic error");
                System.out.println(e.toString());
                System.exit(-100);
            }
    
            return Joiner.on("\n").join(res);
        }
    
        public List<String> getTablePartitionInformation(String dbName, String tableName){
            List<String> partitionsInfo = Lists.newArrayList();
            try {
                List<String> partitionNames = hiveMetaStoreClient.listPartitionNames(dbName,tableName, (short) 10000);
                List<Partition> partitions = hiveMetaStoreClient.listPartitions(dbName,tableName, (short) 10000);
                for(Partition partition:partitions){
                    StringBuffer sb = new StringBuffer();
                    sb.append(tableName);
                    sb.append("\t");
                    List<String> partitionValues = partition.getValues();
                    if(partitionValues.size()<4){
                        int size = partitionValues.size();
                        for(int j=0; j<4-size;j++){
                            partitionValues.add("null");
                        }
                    }
                    sb.append(Joiner.on("\t").join(partitionValues));
                    sb.append("\t");
                    DateTime createDate = new DateTime((long)partition.getCreateTime()*1000);
                    sb.append(createDate.toString("yyyy-MM-dd HH:mm:ss"));
                    partitionsInfo.add(sb.toString());
                }
    
            } catch (TException e) {
                e.printStackTrace();
                return Arrays.asList(new String[]{"error for request on" + tableName});
            }
    
            return partitionsInfo;
        }
    
        public String getAllTableStatistic(String dbName){
            List<String> res = Lists.newArrayList();
            try {
                List<String> tableList = hiveMetaStoreClient.getAllTables(dbName);
                for(String tableName:tableList){
                    res.addAll(getTableColumnsInformation(dbName,tableName));
                }
            } catch (MetaException e) {
                e.printStackTrace();
                System.out.println("getAllTableStatistic error");
                System.out.println(e.toString());
                System.exit(-100);
            }
    
            return Joiner.on("\n").join(res);
        }
    
        public List<String> getTableColumnsInformation(String dbName, String tableName){
            try {
                List<FieldSchema> fields = hiveMetaStoreClient.getFields(dbName, tableName);
                List<String> infs = Lists.newArrayList();
                int cnt = 0;
                for(FieldSchema fs : fields){
                    StringBuffer sb = new StringBuffer();
                    sb.append(tableName);
                    sb.append("\t");
                    sb.append(cnt);
                    sb.append("\t");
                    cnt++;
                    sb.append(fs.getName());
                    sb.append("\t");
                    sb.append(fs.getType());
                    sb.append("\t");
                    sb.append(fs.getComment());
                    infs.add(sb.toString());
                }
    
                return infs;
    
            } catch (TException e) {
                e.printStackTrace();
                System.out.println("getTableColumnsInformation error");
                System.out.println(e.toString());
                System.exit(-100);
                return null;
            }
        }
    }
    
  3. from https://stackoverflow.com/questions/29239565/hive-how-do-i-retrieve-all-the-databases-tables-columns by cc-by-sa and MIT license