如何根据HDFS位置路径获取hive表名?没有连接到Metastore

时间:2014-04-10 13:34:05

标签: hadoop hive

我知道如何通过Meta-store获取基于HDFS位置的hive表名。例如,如果我需要获取HDFS位置hdfs://xyz.com:8020/user/hive/warehouse/test

的表名
  1. 我将使用JDBC连接到hive Metastore。
  2. 针对表TBLSSDS运行查询,SDS.location将具有表的位置值,并获取TBLS.tbl_name
  3. 但是,我还需要其他方法来获取表名吗?

    有可能吗?

2 个答案:

答案 0 :(得分:1)

通过这种方式,我们可以获得提供的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());
      }
 }                              

答案 1 :(得分:0)

Hive Warehouse位置中的目录名称是表名。

例如,如果在Hive中创建表testTable,则相应地在Hive仓库目录中创建具有相同名称的目录。

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

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

还有可能/user/hive/warehouse,这是hive用于存储表格数据的默认仓库位置。 hive-default.xml中定义的内容可能已被覆盖&amp;蜂巢实际上可能正在为其仓库使用不同的位置。您应该检查环境中的hive-site.xml以确定hive Metastore位置。