我知道如何通过Meta-store获取基于HDFS位置的hive表名。例如,如果我需要获取HDFS位置hdfs://xyz.com:8020/user/hive/warehouse/test
TBLS
和SDS
运行查询,SDS.location
将具有表的位置值,并获取TBLS.tbl_name
。但是,我还需要其他方法来获取表名吗?
有可能吗?
答案 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位置。