【问题标题】:Need to access Hive metadata tables using Jdbc program需要使用 Jdbc 程序访问 Hive 元数据表
【发布时间】:2014-02-03 13:40:59
【问题描述】:

需要使用 Jdbc 程序访问 Hive 元数据表。Metastore 实际存储什么以及如何访问它?

我试过这样做:

    sql="show tables";
Statement stmt = con.createStatement();

System.out.println("Running: " + sql);
res = stmt.executeQuery(sql);
while (res.next()) {
System.out.println(res.getString(1));
}

所以我得到了表列表,但我想知道该信息存储在哪个表中,以便我可以直接从该表中选择而不是触发 Hive 命令。

我的 Metastore 也是在 PostGreSQL 中配置的。(如果有帮助的话!) 谢谢 希茨

【问题讨论】:

    标签: java eclipse jdbc hadoop hive


    【解决方案1】:

    您可以通过 JDBC 查询 Metastore DB。
    例如:列出表名及其在 HDFS 上的位置:

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.hive.conf.HiveConf;
    import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
    
    public class HiveMetastoreJDBCTest {
    
        public static void main(String[] args) throws Exception {
    
            Connection conn = null;
            try {
                HiveConf conf = new HiveConf();
                conf.addResource(new Path("file:///path/to/hive-site.xml"));
                Class.forName(conf.getVar(ConfVars.METASTORE_CONNECTION_DRIVER));
                conn = DriverManager.getConnection(
                        conf.getVar(ConfVars.METASTORECONNECTURLKEY),
                        conf.getVar(ConfVars.METASTORE_CONNECTION_USER_NAME),
                        conf.getVar(ConfVars.METASTOREPWD));
    
                Statement st = conn.createStatement();
                ResultSet rs = st.executeQuery(
                    "select t.tbl_name, s.location from tbls t " +
                    "join sds s on t.sd_id = s.sd_id");
                while (rs.next()) {
                    System.out.println(rs.getString(1) + " : " + rs.getString(2));
                }
            }
            finally {
                if (conn != null) {
                    conn.close();
                }
            }
    
        }
    }
    

    exists 有一个关于元存储的 ER 图,但它可能不是最新的, 因此,我建议您在测试中运行 metastore DDL script (Hive 0.12) 架构,并从这些表中创建新的 ER 图。 (例如PowerArchitect)

    【讨论】:

      【解决方案2】:

      Metastore 将元信息存储在 Hive 表上 - 名称、分区、列、SSN、SerDes 等。

      Metastore 连接参数存储在hive-site.xml 中(相关属性名为 javax.jdo.option.ConnectionURL、javax.jdo.option.ConnectionUserName 和 javax.jdo.option.ConnectionPassword)

      您可以使用连接参数连接到 Postgres 数据库并运行例如以下命令:

      -- that'll get you the names of all Hive tables
      SELECT tbl_name FROM TBLS;
      
      -- that'll list all Metastore tables
      \d
      

      【讨论】:

      • 好的,谢谢,我会试试这个。还有一个问题,我正在尝试使用主键在 hive 中创建一个表,但在 eclipse 中出现以下错误:运行:创建表 sample_Hive_Table_2 (PERSON_ID INT PRIMARY KEY, PERSON VARCHAR(26)) 线程“主”java.sql.SQLException 中的异常:查询返回非零代码:40000,原因:失败:ParseException 行 1:51 不匹配输入 'PRIMARY' 期望)靠近 'INT ' 在 Hive_Client_17.main(Hive_Client_17.java:48) 的 org.apache.hadoop.hive.jdbc.HiveStatement.executeQuery(HiveStatement.java:194) 的创建表语句中
      • Hive 不支持主键。
      • 感谢您澄清我的疑问。但我确信我们可以为列添加某种约束。我尝试向它添加NOT NULL约束..这是我得到的错误:运行:CREATE TABLE sample_Hive_Table_2(PERSON_ID INT NOT NULL,PERSON VARCHAR(26))线程“main”中的异常java.sql.SQLException:查询返回非零代码:40000,原因:失败:ParseException 行 1:50 不匹配输入 'NOT' 期望)在 org.apache.hadoop.hive.jdbc.HiveStatement.executeQuery(HiveStatement.java: 194) 在 Hive_Client_17.main(Hive_Client_17.java:48)
      猜你喜欢
      • 2014-02-17
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      • 2014-01-28
      • 1970-01-01
      相关资源
      最近更新 更多