Hive 的几种连接方式

测试环境 Hadoop 0.20.2版本、Hive-0.5.0版本、JDK1.6

 

1、一般来说我们对hive的操作都是通过cli来进行,也就是Linux的控制台,但是,这样做本质上是每个连接都存放一个元数据,各个之间都不相同,所以,对于这样的模式我建议是用来做一些测试比较合适,并不适合做产品的开发和应用。

 

2、JDBC连接的方式,当然还有其他的连接方式,比如ODBC等, 这种方式很常用,可以在网上随便找到,就不再累赘了。

 

3、这种方式是直接利用Hive的 Driver class 来直接连接,感觉这种方式不通过JDBC,应该速度会比较快一点(未经验证)。我只是在local模式下测试过。

 

import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.ql.Driver;
import org.apache.hadoop.hive.ql.session.SessionState;

 

public class Test {

    public static void main(String args[]) {
        Vector<String> res = new Vector<String>();
        String sql = "SELECT * from test";
        Driver driver = new Driver(new HiveConf(SessionState.class));
        int ret = driver.run(sql);
        try {
            driver.getResults(res);
        } catch(IOException e) {
            e.printStackTrace();
        }
        driver.close();
        System.out.println(driver.getMaxRows());
        try {
            System.out.println(driver.getSchema());
            //System.out.println(driver.getThriftSchema());
        } catch(Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       
//        System.out.println(res);
//        System.out.println(ret);
    }
}

 

 

### Hive SQL 表连接类型及用法 #### 左外连接 (Left Outer Join) 左外连接返回左表中的所有记录以及右表中满足连接条件的记录;如果右表中不存在匹配,则结果集中相应的列为空。 ```sql SELECT e.empno, e.ename, d.dname FROM emp e LEFT OUTER JOIN dept d ON e.deptno = d.deptno; ``` 此查询将显示所有的员工信息,即使某些员工未分配到任何部门也会被列出,在这种情况下,`dname`字段将是NULL[^1]。 #### 右外连接 (Right Outer Join) 右外连接与左外连接相反,它返回右表中的所有记录以及左表中满足连接条件的记录;对于那些在左表找不到对应项的情况,其对应的列为NULL。 ```sql SELECT e.empno, e.ename, d.dname FROM emp e RIGHT OUTER JOIN dept d ON e.deptno = d.deptno; ``` 这会显示出所有部门的信息,并附带属于这些部门的员工详情。如果有部门没有任何成员,那么该部分的数据将会是空白[^2]。 #### 内部连接 (Inner Join) 内部连接仅当两表存在相同键值时才返回行。这意味着只有同时存在于两个表格里的项目才会出现在最终的结果集里。 ```sql SELECT e.empno, e.ename, d.dname FROM emp e JOIN dept d ON e.deptno = d.deptno; ``` 上述命令只会给出有明确所属关系(即有效部门编号)的雇员名单及其所在单位的名字[^3]。 #### 全外连接 (Full Outer Join) 全外连接会保留来自两侧输入的关系对象的所有原始数据,无论另一侧是否有相配的对象。然而需要注意的是,并不是所有的数据库都支持这个特性,而Hive确实提供了这样的功能。 ```sql SELECT COALESCE(e.empno,-99),COALESCE(e.ename,'None'),COALESCE(d.dname,'No Dept') as DepartmentName FROM emp e FULL OUTER JOIN dept d ON e.deptno=d.deptno; ``` 这里使用了 `COALESCE()` 函数来代替可能产生的 NULL 值,使得输出更加友好易读[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值