概述
说明
对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 ;
最后
以上就是傲娇大山为你收集整理的hive--安装hive,基本命令的全部内容,希望文章能够帮你解决hive--安装hive,基本命令所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复