一、hive的基本概念与原理

Hive是基于Hadoop之上的数据仓库,能够存储、查询和分析存储在 Hadoop 中的大规模数据。

Hive 定义了简单的类 SQL 查询语言,称为 HQL。它同意熟悉 SQL 的用户查询数据,同意熟悉 MapReduce 开发人员的开发自己定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完毕的复杂的分析工作。

Hive 没有专门的数据格式。

hive的訪问方式:



hive的运行原理:

二、hive的经常使用命令

连接进入hive:hive

删除数据库:drop database if exists qyk_test cascade;例如以下图:



然后,我们使用create database qyk_test;创建一个qyk_test的数据库,例如以下:



接下来,我们运行create table user_info(id bigint, account string, name string, age int) row format delimited fields terminated by ‘\t’;创建一张表,例如以下:



我们能够运行describe user_info;查看表结构。例如以下:



然后。我们使用create table user_info_tmp like user_info;创建一个和user_info一样结构的暂时表,例如以下:



然后我们准备一个文件user_info.txt,以制表符分隔,例如以下

11  1200.0  qyk1    21
22 1301 qyk2 22
33 1400.0 qyk3 23
44 1500.0 qyk4 24
55 1210.0 qyk5 25
66 124 qyk6 26
77 1233 qyk7 27
88 15011 qyk8 28

接下来运行load data local inpath ‘/tmp/user_info.txt’ into table user_info;可看到例如以下:



然后运行select * from user_info;可看到:



然后,我们运行insert into table user_info_tmp select id, account, name, age from user_info;能够看到:



这里,hive将此语句的运行转为MR,最后将数据入到user_info_tmp。

然后。我们运行select count(*) from user_info_tmp;可看到:



相同的是将sql转为mr运行。

最后,运行insert overwrite table user_info select * from user_info where 1=0;清空表数据。

运行drop table user_info_tmp;便可删除表,例如以下:



好了,基本命令就说到这儿,关于外部表、分区、桶以及存储格式相关的概念大家也能够去研究下。

三、编写MR将数据直接入到hive

此MR仅仅有Mapper,没有reducer。直接在mapper输出到hive表。

pom需新增依赖:

<!-- hcatalog相关jar -->
<dependency>
<groupId>org.apache.hive.hcatalog</groupId>
<artifactId>hive-hcatalog-core</artifactId>
<version>${hive.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hive.hcatalog</groupId>
<artifactId>hive-hcatalog-hbase-storage-handler</artifactId>
<version>${hive.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hive.hcatalog</groupId>
<artifactId>hive-hcatalog-server-extensions</artifactId>
<version>${hive.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hive.hcatalog</groupId>
<artifactId>hive-hcatalog-pig-adapter</artifactId>
<version>${hive.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hive.hcatalog</groupId>
<artifactId>hive-webhcat-java-client</artifactId>
<version>${hive.version}</version>
</dependency>

Mapper类:

/**
* Project Name:mr-demo
* File Name:HiveStoreMapper.java
* Package Name:org.qiyongkang.mr.hivestore
* Date:2016年4月4日下午10:02:07
* Copyright (c) 2016, CANNIKIN(http://http://code.taobao.org/p/cannikin/src/) All Rights Reserved.
*
*/ package org.qiyongkang.mr.hivestore; import java.io.IOException; import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hive.hcatalog.data.DefaultHCatRecord;
import org.apache.hive.hcatalog.data.HCatRecord;
import org.apache.hive.hcatalog.data.schema.HCatSchema;
import org.apache.hive.hcatalog.mapreduce.HCatOutputFormat; /**
* ClassName:HiveStoreMapper <br/>
* Function: Mapper类. <br/>
* Date: 2016年4月4日 下午10:02:07 <br/>
* @author qiyongkang
* @version
* @since JDK 1.6
* @see
*/
public class HiveStoreMapper extends Mapper<Object, Text, WritableComparable<Object>, HCatRecord> {
private HCatSchema schema = null; //每一个mapper实例,运行一次
@Override
protected void setup(Mapper<Object, Text, WritableComparable<Object>, HCatRecord>.Context context)
throws IOException, InterruptedException {
schema = HCatOutputFormat.getTableSchema(context.getConfiguration());
} @Override
protected void map(Object key, Text value, Mapper<Object, Text, WritableComparable<Object>, HCatRecord>.Context context)
throws IOException, InterruptedException {
//每行以制表符分隔 id, account, name, age
String[] strs = value.toString().split("\t"); HCatRecord record = new DefaultHCatRecord(4);
//id,通过列下表
record.set(0, Long.valueOf(strs[0])); //account
record.set(1, strs[1]); //name
record.set(2, strs[2]); //age,通过字段名称
record.set("age", schema, Integer.valueOf(strs[3])); //写入到hive
context.write(null, record);
} public static void main(String[] args) {
String value = "1 1200 qyk 24";
String[] strs = value.toString().split("\t");
for (int i = 0; i < strs.length; i++) {
System.out.println(strs[i]);
}
}
}

主类:

/**
* Project Name:mr-demo
* File Name:LoadDataToHiveMR.java
* Package Name:org.qiyongkang.mr.hivestore
* Date:2016年4月4日下午9:55:42
* Copyright (c) 2016, CANNIKIN(http://http://code.taobao.org/p/cannikin/src/) All Rights Reserved.
*
*/ package org.qiyongkang.mr.hivestore; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hive.hcatalog.data.DefaultHCatRecord;
import org.apache.hive.hcatalog.data.schema.HCatSchema;
import org.apache.hive.hcatalog.mapreduce.HCatOutputFormat;
import org.apache.hive.hcatalog.mapreduce.OutputJobInfo; /**
* ClassName:LoadDataToHiveMR <br/>
* Function: MR将数据直接入到hive. <br/>
* Date: 2016年4月4日 下午9:55:42 <br/>
*
* @author qiyongkang
* @version
* @since JDK 1.6
* @see
*/
public class LoadDataToHiveMR {
public static void main(String[] args) {
Configuration conf = new Configuration();
try {
Job job = Job.getInstance(conf, "hive store");
job.setJarByClass(LoadDataToHiveMR.class); // 设置Mapper
job.setMapperClass(HiveStoreMapper.class); // 由于没有reducer。这里设置为0
job.setNumReduceTasks(0); // 设置输入文件路径
FileInputFormat.addInputPath(job, new Path("/qiyongkang/input")); // 指定Mapper的输出
job.setMapOutputKeyClass(WritableComparable.class); // map
job.setMapOutputValueClass(DefaultHCatRecord.class);// map //设置要入到hive的数据库和表
HCatOutputFormat.setOutput(job, OutputJobInfo.create("qyk_test", "user_info", null));
//这里注意是使用job.getConfiguration(),不能直接使用conf
HCatSchema hCatSchema = HCatOutputFormat.getTableSchema(job.getConfiguration());
HCatOutputFormat.setSchema(job, hCatSchema); //设置输出格式类
job.setOutputFormatClass(HCatOutputFormat.class); job.waitForCompletion(true);
} catch (Exception e) {
e.printStackTrace();
}
} }

然后。我们使用maven打个包,上传到服务器。

然后。我们准备一个user_info.txt,上传至hdfs中的/qiyongkang/input下:

11  1200.0  qyk1    21
22 1301 qyk2 22
33 1400.0 qyk3 23
44 1500.0 qyk4 24
55 1210.0 qyk5 25
66 124 qyk6 26
77 1233 qyk7 27
88 15011 qyk8 28

注意以制表符\t分隔。

然后运行yarn jar mr-demo-0.0.1-SNAPSHOT-jar-with-dependencies.jar。在jobhistory能够看到:



事实上,hive的元数据是放在hdfs上。运行hadoop fs -ls /user/hive/warehouse能够看到:



然后,我们在hive命令行运行 select * from user_info;能够看到:



说明数据从hdfs写入到hive成功。

四、使用java jdbc连接Thrift Server查询元数据

接下来,我们使用java编写一个客户端,来查询刚才入到hive里面的数据,代码例如以下:

package org.hive.demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.log4j.Logger; public class HiveStoreClient {
private static String driverName = "org.apache.hive.jdbc.HiveDriver";
private static String url = "jdbc:hive2://172.31.25.8:10000/qyk_test";
private static String user = "hive";
private static String password = "";
private static final Logger log = Logger.getLogger(HiveStoreClient.class); @SuppressWarnings("rawtypes")
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet res = null;
try {
//载入驱动
Class.forName(driverName);
//获取连接
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement(); // select * query
String sql = "select * from user_info";
System.out.println("Running: " + sql); //运行查询
res = stmt.executeQuery(sql); //处理结果集
List list = convertList(res);
System.out.println("总记录:" + list); //获取总个数
sql = "select count(1) from user_info";
System.out.println("Running: " + sql);
res = stmt.executeQuery(sql);
while (res.next()) {
System.out.println("总个数:" + res.getString(1));
} } catch (ClassNotFoundException e) {
e.printStackTrace();
log.error(driverName + " not found!", e);
System.exit(1);
} catch (SQLException e) {
e.printStackTrace();
log.error("Connection error!", e);
System.exit(1);
} finally {
try {
res.close();
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
} } /**
*
* convertList:将结果集转换成map. <br/>
*
* @author qiyongkang
* @param rs
* @return
* @throws SQLException
* @since JDK 1.6
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static List convertList(ResultSet rs) throws SQLException {
List list = new ArrayList();
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount(); //Map rowData; while (rs.next()) { //rowData = new HashMap(columnCount);
Map rowData = new HashMap();
for (int i = 1; i <= columnCount; i++) {
rowData.put(md.getColumnName(i), rs.getObject(i));
}
list.add(rowData);
}
return list;
}
}

运行后,能够看到控制台输出例如以下:



開始的异常能够忽略。

能够看到数据,说明是成功的。

好了,hive就说到这儿了。

事实上,hive还能够同步hbase的数据,还能够将hive的表数据同步到impala。由于它们都是使用相同的元数据,这个在后面的博文中再进行介绍。

hadoop生态系统学习之路(六)hive的简单使用的更多相关文章

  1. hadoop生态系统学习之路(八)hbase与hive的数据同步以及hive与impala的数据同步

    在之前的博文中提到,hive的表数据是能够同步到impala中去的. 一般impala是提供实时查询操作的,像比較耗时的入库操作我们能够使用hive.然后再将数据同步到impala中.另外,我们也能够 ...

  2. hadoop生态系统学习之路(十)MR将结果输出到hbase

    之前讲了MR将结果输出到hdfs.hive.db,今天再给大家分享一下,怎样将结果输出到hbase. 首先,提一句,笔者在hadoop集群运行此MR的时候报了一个错误.是一个jar包的缘故,这个错误是 ...

  3. Hadoop生态系统学习路线

    主要介绍Hadoop家族产品,经常使用的项目包含Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa.新添加 ...

  4. zigbee学习之路(六):Time3(查询方式)

    一.前言 通过上次的学习,相信大家对cc2530单片机的定时器的使用有了一定的了解,今天我们来介绍定时器3的使用,为什么介绍定时器3呢,因为它和定时器4功能是差不多的,所以学会定时器3,就基本掌握了c ...

  5. react.js学习之路六

    学习react中,我一直认为,总组件里面才有构造函数,但是我才发现我的观点是错误的,构造函数是可以出现在子组件里面的. 今天有一个错误是点击增加/减少input框里面 的数值 我一直在寻找input框 ...

  6. 嵌入式Linux驱动学习之路(六)u-boot启动内核

    内核启动是需要必要的启动参数.不能开机自动完全从0开始启动,需要uboot帮助内核实现重定位并提供参数. 首先,uboo会从Kernel分区中读取bootcmd环境变量,根据环境变量可自动启动. 分区 ...

  7. Java学习之路(六)

    1:包及和访问权限 将类放置到一个包当中,需要使用package “包名” 编译时需要使用 -d 参数  该参数的作用是依照包名生成相应的文件夹 一个类的全民应该是  “包名” + “.” + “类名 ...

  8. ios7学习之路六(隐藏状态栏 )

    方法一(代码设置): 现在ios7已经更改为透明,并且不占用屏幕高度.其中隐藏及显示的方法如下: 在uiviewcontroller的子类下,调用:      if ([self respondsTo ...

  9. IOS学习之路六(UITableView滑动删除指定行)

    滑动删除指定行代码如下: Controller.h文件 #import <UIKit/UIKit.h> @interface TableViewController : UIViewCon ...

随机推荐

  1. Vue处理边界之$root、$parent、$refs

    Vue处理边界之parent.$refs 下面的功能都是有风险的,尽量避免使用 1.Vue 子组件可以通过 $root 属性访问父组件实例的属性和方法 <div id="app&quo ...

  2. Xcode 真机调试报错:This application's application-identifier entitleme

        This application's application-identifier entitlement does not match that of the installed appli ...

  3. 【HDOJ5972】Regular Number(Bitset,ShiftAnd)

    题意:给你N位数,接下来有N行,第i行先输入n,表示这个数的第i 位上可以在接下来的n个数中挑选,然后i 行再输n个数. 然后输入需要匹配的母串,让你输出母串中有多少个可行的N位子串. n<=1 ...

  4. poj 3623 Best Cow Line, Gold 后缀数组 + 贪心

    题目链接 题目描述 对于一个给定的字符串,可以从左右两端取字符,依次排列构成一个新的字符串. 求可能构成的字符串中字典序 最小的一个. 例:ACDBCB -> ABCBCD 思路 参考自 xue ...

  5. 安装配置Vim中文帮助文档

    1.home/.vimrc是用户自己的vim配置文件,在这个配置文件中设置的配置只影响该用安装前的准备工作: 在home目录下列新建文件夹  : .vim ------------------> ...

  6. SQL语句的执行顺序(转载+不同意见)

    MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来 ...

  7. 分享C#识别图片上的数字

    通过Emgu实现对图片上的数字进行识别.前期步骤:1.下载Emgu安装文件,我的版本是2.4.2.1777.3.0版本则实现对中文的支持.2.安装后需填写环境变量,环境变量Path值后加入Emgu安装 ...

  8. IIS 配置缓存

    IIS8设置应用程序池-高级设置-启动模式:AlwaysRunning 应用程序池-高级设置-进程模型-闲置超时:1740 (分钟) 应用程序-高级设置-常规-预加载已启用:True

  9. python-urllib/urllib2模块

    urllib与urllib2: urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL.这意味着,你不可以伪装你的User Agent字符串等. ...

  10. bzoj 5123: [Lydsy1712月赛]线段树的匹配

    设f[0/1][x]为区间[1,x]的根向下 不选(0)或者选(1)  的dp pair<最优值,方案数>. 可以很容易的发现总状态数就是log级别的,因为2*n 与 (2*n+1 或者 ...