Hadoop 如何根据HDFS位置路径获取配置单元表名?不连接到metastore
我知道如何通过元存储根据HDFS位置获取配置单元表名。例如,如果我需要获取HDFS位置的表名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://xyz.com:8020/user/hive/warehouse/test
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());
}
}