hive--安装hive,基本命令

说明

    对hive基本命令进行实战,要求本机安装着mysql和启动hdfs。
    hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,
    并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 
    其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,

    不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。

本地localhost模式安装hdfs

//在“/home/hadoop/hadoop”目录下,解压hadoop-2.7.1.tar.gz,其它版本的也是一样的操作
>tar -xzvf hadoop-2.7.1.tar.gz
//修改"hadoop-2.7.1/etc/hadoop"下的"hdfs-site.xml"文件,修改副本数为1
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>
//修改当前目录下,"core-site.xml"文件
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/hadoop/tmp</value>
    </property>
</configuration>

格式化文件系统

>hadoop namenode -format

启动hdfs

//方式1,cd到hadoop-2.7.1的bin目录下执行
> ./start-dfs.sh
//方式2,cdcd到hadoop-2.7.1的sbin目录下执行
//先启动namenode
>./hadoop-daemon.sh start namenode
//后启动datanode
>./hadoop-daemon.sh start datanode

查看hdfs,浏览器访问本机50070端口,单节点本地模式的hdfs启动成功


本地安装mysql(略)

本地安装hive

下载2.1.1版本的hive http://mirrors.hust.edu.cn/apache/hive/hive-2.1.1/apache-hive-2.1.1-bin.tar.gz

//把hive tar.gz压缩包解压到你指定的目录下,我的在"/home/hadoop/hive"下
//解压后目录,/home/hadoop/hive/apache-hive-2.1.1-bin
//在"/home/hadoop/hive"下新建3个文件夹
//分别是日志文件夹,下载资源文件夹,中间结果临时文件目录
> mkdir log download tmp

//把mysql驱动jar包mysql-connector-java-5.1.17.jar放到hive主目录的lib文件夹下

修改hive的配置文件
//在"apache-hive-2.1.1-bin/conf"目录下,由"hive-default.xml.template"复制出一份配置文件,名称"hive-site.xml"
> cp hive-default.xml.template hive-site.xml

//修改以下几个标签中的值,它们没有在一起,剪切到一起后修改也可以,一处处修改也可
//分别指定数据库密码,数据库用户名,数据库地址和库名(要求我们先在mysql建一个空的库,名字自定义),驱动类名
<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>root</value>
    <description>password to use against metastore database,mysql数据库密码</description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
    <description>Username to use against metastore database</description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://192.168.1.215:3306/hive2</value>
    <description>
      JDBC connect string for a JDBC metastore.
      To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL.
      For example, jdbc:postgresql://myhost/db?ssl=true for postgres database.
    </description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>Driver class name for a JDBC metastore</description>
  </property>

修改"hive-site.xml"中日志、中间结果、下载资源文件目录,找到图中红圈value修改


<!-- 修改中间结果目录-->
  <property>
    <name>hive.exec.local.scratchdir</name>
    <value>/home/hadoop/hive/tmp</value>
    <description>Local scratch space for Hive jobs</description>
  </property>
<!-- 修改下载资源目录-->
  <property>
    <name>hive.downloaded.resources.dir</name>
    <value>/home/hadoop/hive/download</value>
    <description>Temporary local directory for added resources in the remote file system.</description>
  </property>
<!-- 修改查询日志目录-->
  <property>
    <name>hive.querylog.location</name>
    <value>/home/hadoop/hive/log</value>
    <description>Location of Hive run time structured log file</description>
  </property>
<!-- 修改server2 日志目录-->
  <property>
    <name>hive.server2.logging.operation.log.location</name>
    <value>/home/hadoop/hive/log</value>
    <description>Top level directory where operation logs are stored if logging functionality is enabled</description>
  </property>
配置环境变量
//创建hive目录的软连接,ln 创建连接命令 -s创建软连接 后面接原文件或目录路径 后面接目标文件名
> ln -s /home/hadoop/hive/apache-hive-2.1.1-bin/ hive

//配置环境变量
> vi /etc/profile
//在文件末尾添加
#配置hive
export HIVE_HOME=/home/hadoop/hive/hive
export PATH=$HIVE_HOME/bin:$PATH

hive基本命令

确保mysql hdfs启动的情况下,执行hive命令

//查看hive版本
>hive --version
//命令框中输入hive,进入hive command
>hive
//创建库
hive> create database mydb;

会发现hdfs上生成了“mydb.db”文件


查看所有的数据库

hive>show databases;

跟mysql命令一样

//查看有哪些库
hive>show databases;
//使用某个库
hive>use mydb;
//查看有哪些表
hive>show tables;
//创建表
hive>create table t1(id int,name string,age int);
//查看创建表的结构
hive>desc t1;
//hive删除表
hive>drop table t;
hive>drop table mydb.t ;
//查看表中的内容
hive>select * from mydb.t ;

查看hdfs上文件目录

>hdfs dfs -ls -R /


hive中的表

    mysql记录的是创建表的元数据(表名,字段,创建时间),hdfs上存储的是表中的数据。hive在mysql中的“TBLS”记录着在hdfs上创建的表信息


managed table(托管表),删除表的时候,表中数据也就删除了

external table(外部表),删除表的时候,表中数据不删除

    向表中插入数据

hive>insert into t1(id,name,age) values (1,'tom',16);
hdfs"mydb.db/t1"目录下新生成了一个文件"000000_0",查看文件的内容
>hdfs dfs -cat /user/hive/warehouse/mydb.db/t1/000000_0

//hive命令交互窗口中,查看表中的内容
hive>select * from t1;
//也可在hive命令交互窗口中,查看dfs目录
hive> dfs -ls -R / ;

java api 访问hive仓库

    引入jar包依赖

<dependency>
     <groupId>org.apache.hive</groupId>
     <artifactId>hive-jdbc</artifactId>
     <version>2.1.1</version>
</dependency>

    设置hdfs的代理用户hosts和组,不然连接hive的时候会报错

<property>
  <name>hadoop.proxyuser.hadoop.hosts</name>
  <value>*</value>
 </property>
 <property>
  <name>hadoop.proxyuser.hadoop.groups</name>
  <value>*</value>
</property>

    后台启动hiveserver2服务

>hive --service hiveserver2 &

    下面是java 访问hive代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 * jdbc访问hive仓库,需要hive开启hiveserver2服务
 */
public class TestDemo {
    public static void main(String[] args) throws Exception {
        Class.forName("org.apache.hive.jdbc.HiveDriver");
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        conn = DriverManager.getConnection("jdbc:hive2://192.168.1.215:10000/mydb");
        st = conn.createStatement();
        rs = st.executeQuery("select * from t1");
        while(rs.next()){
            System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getInt(3));
        }
        rs.close();
        st.close();
        conn.close();
    }
}
创建表命令

    创建管理表(也叫internal内部表)语法,此供参考,之前我们已经创建了表t1

hive>CREATE TABLE IF NOT EXISTS t2(  //IF NOT EXISTS 可选项,如果不存在创建
name string,
work_place ARRAY<string>,  //字段是数组
sex_age STRUCT<sex:string,age:int>,  //字段是自定义结构体
skills_score MAP<string,int>,  //字段是MAP类型
depart_title MAP<STRING,ARRAY<STRING>>)  //字段是MAP类型,其中嵌套结构体
COMMENT 'this is an internal table' //添加表注释
ROW FORMAT DELIMITED //行由定界符格式化
FIELDS TERMINATED BY ','  //字段分隔符
COLLECTION ITEMS TERMINATED BY ','  //数组中项分隔符
MAP KEYS TERMINATED BY ':' //MAP key value分隔符
STORED AS TEXTFILE;  //以文本形式存储
    新创建一个表t2,external 关键字说明要创建外部表
   
CREATE external TABLE IF NOT EXISTS t2(id int,name string,age int)
COMMENT '注释' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE ;
     hive从外部文件加载数据,准备一个文件
1,tom1,14
2,tom2,16
3,tom3,18
4,tom4,19
5,jenny,22
    hive从外部文件加载数据
//从本地上传文件,文件地址需要加引号
hive>load data local inpath '/home/hadoop/hive2load.txt' into table t2 ;
//查看表中的数据
hive>select * from t2;

//从hdfs上上传文件
//首先上传本地文件到hdfs
>hdfs dfs -put hive2load.txt /

//overwrite 是否覆盖,是可选项
hive>load data inpath '/hive2load.txt' [overwrite] into table t2;

    上面从hdfs再加载一次hive2load.txt文件数据到t2表中,hdfs上"/hive2load.txt"文件移动追加到t2表中

    复制表和数据

//复制表和数据
hive>create table t3 as select * from t2;
//复制表结构
hive>create table t4 like t2;
     查询表数据
//全表扫描,不经过mr
hive>select * from t2;
//count聚合,要经mr处理
hive>select count(*) from t2;
//不经过mr
hive>select id,name from t2;
//启用/禁用表
$hive>ALTER TABLE t2 ENABLE NO_DROP;	//不允许删除
$hive>ALTER TABLE t2 DISABLE NO_DROP;	//允许删除

分区表

    分区表,优化手段之一,从目录的层面控制搜索数据的范围。
//创建分区表.
$hive>CREATE TABLE t5(id int,name string,age int) PARTITIONED BY (Year INT, Month INT) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

//添加分区,创建目录
$hive>alter table t5 add partition (year=2014, month=12);
//删除分区
hive>ALTER TABLE t5 DROP IF EXISTS PARTITION (year=2014, month=11);
//分区结构
hive>/user/hive/warehouse/mydb.db/t5/year=2014/month=11
hive>/user/hive/warehouse/mydb.db/t5/year=2014/month=12
//加载数据到分区表
hive>load data local inpath '/home/hadoop/customers.txt' into table t5 partition(year=2014,month=11);
//查询某个分区中的数据,其实是查目录,表中没有这个字段
hive>select * from t5 where year=2014 and month=11;

桶表

//创建桶表
$hive>CREATE TABLE t4(id int,name string,age int) CLUSTERED BY (id) INTO 3 BUCKETS 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

//加载数据不会进行分桶操作
$hive>load data local inpath '/home/centos/customers.txt' into table t4 ;
//查询t3表数据插入到t4中。
$hive>insert into t4 select id,name,age from t3 ;

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值