Hadoop 如何根据HDFS位置路径获取配置单元表名?不连接到metastore

Hadoop 如何根据HDFS位置路径获取配置单元表名?不连接到metastore,hadoop,hive,Hadoop,Hive,我知道如何通过元存储根据HDFS位置获取配置单元表名。例如,如果我需要获取HDFS位置的表名hdfs://xyz.com:8020/user/hive/warehouse/test 我将使用JDBC连接到hive元存储 对表TBLS和SDS运行查询,SDS.location将具有表的location值,并获取TBLS.tbl\u name 但是,我需要其他方法来获取表名吗 可能吗?您的配置单元仓库位置中的目录名是表名 例如,如果您在配置单元中创建一个表testTable,则相应地在配置单元仓库目

我知道如何通过元存储根据HDFS位置获取配置单元表名。例如,如果我需要获取HDFS位置的表名
hdfs://xyz.com:8020/user/hive/warehouse/test

  • 我将使用JDBC连接到hive元存储
  • 对表
    TBLS
    SDS
    运行查询,
    SDS.location
    将具有表的location值,并获取
    TBLS.tbl\u name
  • 但是,我需要其他方法来获取表名吗


    可能吗?

    您的配置单元仓库位置中的目录名是表名

    例如,如果您在配置单元中创建一个表
    testTable
    ,则相应地在配置单元仓库目录中创建一个同名目录

    此外,如果在配置单元表上创建分区,每个分区都将映射到
    testTable
    目录中的子目录,即
    /testTable/
    。特定分区下的所有数据都存储在分区子目录下的文件中。这是hive在HDFS上管理数据的方式。当然,它将表模式存储在元存储上,但实际数据如上所述存储在HDFS中

    在您的问题中,您表示希望获取HDFS位置的表名
    hdfs://xyz.com:8020/user/hive/warehouse/test
    。在这种情况下,表名应为
    test


    还有一种可能性是,
    /user/hive/warehouse
    ,这是配置单元用于存储表数据的默认仓库位置,在
    hive default.xml
    中定义,它可能已被覆盖&配置单元可能实际上正在为其仓库使用不同的位置。您应该在您的环境中检查
    hive site.xml
    ,以确定hive元存储的位置

    通过这种方式,我们可以获得提供的hdfs位置的表名…:)

    HiveConf hc=新的HiveConf(yourclass.class);
    hc.set(“hive.metastore.local”、“false”);
    hiveuris=”thrift://xyz.com:9083";
    hc.setVar(HiveConf.ConfVars.METASTOREURIS,hiveuris);
    //hiveuri是hive-site.xml中的属性“hive.metastore.uris”值
    hc.setBoolVar(HiveConf.ConfVars.METASTORE\u USE\u THRIFT\u SASL,false);
    HiveMetaStoreClient hiveClient=HCatUtil.getHiveClient(hiveConf);
    //把所有的桌子都收拾好
    List tables=hiveClient.getAllTables(“默认值”)//默认值是databasename
    //在表格中循环并规划所需的路径
    字符串路径=”hdfs://xyz.com:8020/user/hive/warehouse/test"; //查找表名的hdfs路径
    //找到上面路径的talbe
    对于(字符串表:表){
    Table ht=HCatUtil.getTable(hiveClient,“default”,Table);
    if(path.equals(ht.getMetadata().get(“location”)){
    System.out.println(“找到的表名:+ht.getTableName());
    }
    }                              
    
    感谢回复,但在创建配置单元表时,我们可以使用create语句中的“location”参数将任何HDFS目录路径称为配置单元表位置。如果我选择了默认配置单元仓库目录以外的任何其他位置,在这种情况下,您的解决方案将失败。
    HiveConf hc = new HiveConf(yourclass.class);
    hc.set("hive.metastore.local", "false");
    hiveuris = "thrift://xyz.com:9083";
    hc.setVar(HiveConf.ConfVars.METASTOREURIS,hiveuris); 
    //hiveuri is the property "hive.metastore.uris" value from hive-site.xml
    
    hc.setBoolVar(HiveConf.ConfVars.METASTORE_USE_THRIFT_SASL, false);
    HiveMetaStoreClient hiveClient = HCatUtil.getHiveClient(hiveConf);
    //get all tables
    List<String> tables = hiveClient.getAllTables("default");//default is databasename
    //loop through tables and complare the needed path
    String path = "hdfs://xyz.com:8020/user/hive/warehouse/test"; //hdfs path to find table name
    //find talbe for above path
    for (String table:tables){                              
         Table ht = HCatUtil.getTable(hiveClient, "default", table);
         if (path.equals(ht.getMetadata().get("location")) ){
         System.out.println("Found table name:"+ht.getTableName());
          }
     }