3-hive、sqoop
1、HIVE
1、交互命令
use db_name; create database db_name //创建数据库 create database if not exists db_name //创建不存在的数据库 create database db_name location '/database/' //指定位置上创建数据库 show databases; show databases like 'f.*'; //模糊查询 drop database db_name drop database db_name cascade; //当数据库中有表,必须使用cascade
2、Hive操作
①数据库
use db_name; create database db_name //创建数据库 create database if not exists db_name //创建不存在的数据库 create database db_name location '/database/' //指定位置上创建数据库 show databases; show databases like 'f.*'; //模糊查询 drop database db_name drop database db_name cascade; //当数据库中有表,必须使用cascade
②数据表
、管理表:在删除表的时候,会同时把表中对应的数据删除; 、外部表:在删除表的时候不会删除表中对应的数据,而只会删除表中的元数据信息; 、分区表:Hive的分区就是分目录,把一个大的数据集拆分成一个个小的数据集,独立保存在不同的我文件夹中。 在查询的时候可以通过where子句进行查询,提高查询效率。 、分桶:将一个文件分成几个小文件(基本没啥用)。 ———————————————————————————————————————————————————————————— 、管理表(内部表),外部表 ———————————————————————————————————————————————————————————— create table t1(id int,name string) row format delimited fields terminated by '\t'; //创建一个分隔符为\t的管理表 create external table t1(id int,name string) row format delimited fields terminated by '\t'; //创建一个分隔符为\t的外部表 ———————————————————————————————————————————————————————————— 、分区表 ———————————————————————————————————————————————————————————— create table t1(id int ,name string) partitioned by (day string) row format delimited fields terminated by '\t'; create table t4( id int , name string ) partitioned by (month string,day string) row format delimited fields terminated by '\t'; //创建二级分区 '; '; //查询二级分区内容 show partitions t1; //显示表t1的分区 ①分区类型: 静态分区:加载数据时指定分区的值 load data local inpath '/home/1.txt' into table t1 partition (sex='woman'); 动态分区:数据未知,需要根据分区的值来确定需要创建的分区 insert overwrite table t1 partition(sex='man',dt) //把t1中的数据分一个sex='man'的区 混合分区:静态和动态都有
③通用命令
create table if not exists t2 like t1; //创建同一结构的表 alter table t1 add columns(value1 string,value2 string); //增加列 alter table t1 replace columns(value3 string,value4 string); //替换列 alter table t1 add partition(day='); //增加分区 alter table t1 drop partition(day='); desc t1; //查看表结构 show tables; show functions; //显示hive函数 drop table t1; truncate table t1; //清空表的数据 ———————————————————————————————————————————————————————— ①数据导入导出: ———————————————————————————————————————————————————————— 语法: load data [local] inpath ')]; insert [overwrite] [directory 'url' | local directory 'url' | table tablename] HQL; insert into t1(id,name) value(,'asd'); insert into t1 partition(month=,'bangzhang'); load data inpath '/home/bigdata' into table hive.dep; //把hdfs上的文件剪切到dep的表中,如果文件存在,则追加内容 load data inpath '/home/bigdata' overwrite into table hive.dep; //把hdfs上的文件剪切到dep的表中,如果文件存在,则覆盖 load data local inpath '/home/bigdata' overwrite into table hive.dep; //把本地文件传到hive数据库的dep的表中 load data local inpath '); //加载数据到分区表 load data local inpath '); //加载数据到二级分区 insert overwrite table t2 select * from t1; //从t1挑选数据重写到t2 insert overwrite directory '/aaa/bbb/' select *from t_p; //将挑选出来的数据写到hdfs目录下 insert overwrite local directory '/home/hadoop/test' select *from t_name; //将挑选出来的数据写到本地目录下 hdfs dfs -get /user/hive/warehouse/student4/student.txt /data/student5.txt; //通过hdfs进行导出
④HQL语句(排序)
order by:全局排序 //全局排序,适用于一个reduce distribute by :指定字段分区 //必须设置reduce个数,不然只会有一个reduce,一个分区 sort by:reduce排序 partition by :用于窗口函数中 cluster by:当分区字段和排序字段相同时,可以用cluster by clustered by:分桶关键字 select * from t1 order by sal DESC,deptno ASC; //全局排序,适用于一个reduce ; //设置reduce个数,默认为1,系统默认reduce个数为分区个数 select * from t1 distribute by deptno sort by id DESC; //distribute by 分区 //sort by 排序 select classID,SUM(grade) over(partition by classID) fromtb_Student //窗口函数:over关键字 select mid, money, name from store cluster by mid ==> select mid, money, name from store distribute by mid sort by mid
⑤窗口函数
窗口函数:row_number、rank、dense_rank a a b b a a a b a b a select id,name,sal, rank()over(partition by name order by sal desc ) rp, dense_rank() over(partition by name order by sal desc ) drp, row_number()over(partition by name order by sal desc) rmp from f_test b b b b a a a a a a a 可以发现,窗口函数就是多了一列的排名列 partition by name order by sal desc <==> distribute by name sort by id desc 也就是说:partition by 和 distribute by等价,但是后面是order by 而不是sort by 窗口函数:LAG和LEAD:增加一列,列的值就是前(后)一行的某一列的值 窗口函数:first_value和last_value first_value取分组内排序后,截止到当前行,第一个值 last_value取分组内排序后,截止到当前行,最后一个值
⑥自定义正则输入
注:有时候数据并非是用 '\t' 进行分割,就需要自己清洗。 CREATE TABLE apachelog ( host string, identity string, agent string )row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe' //以正则的方式建表 WITH SERDEPROPERTIES ( "input.regex" = "([^]*) ([^]*) ([^]*)" //用正则提取,每个()表示一个字段,里面是正则表达式 ) stored as textfile ;
⑦自定义HIVE函数
注:经过上一步之后,字段中保存的是“/Aug/::: +”,我们希望在select能将它变为2015-- ::37这种标准格式。 public class TestUDF extends UDF{ public String evaluate(String time) throws ParseException { String output=null; SimpleDateFormat inputDate=new SimpleDateFormat("dd/MM/yyyy:HH:mm:ss",Locale.ENGLISH); SimpleDateFormat outputDate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if(time==null) { return null; } if(StringUtils.isBlank(time)) { return null; } String pares=time.replaceAll("\"", ""); Date parseDate=inputDate.parse(pares); output=outputDate.format(parseDate); return output; } } 注:UDF是HIVE自定义函数的类。 、重写evaluate方法。 、打包成jar,上传到linux 、add jar /data/myudf.jar; //hive命令行 、create temporary function my_upper as "org.udf.test.Lower"; //给函数取名,并且关联包中的类 、select my_upper(name) as name from student7; //调用 自定义函数是非常重要的,对于很多数据,用函数对其清洗,使其规律化。
⑧压缩
和MR一样,都有压缩,分为map端压缩和reduce端压缩,可以在配置文件中设置。
注:为了减少网络传输,将map产生的分区文件进行压缩,然后传给reduce,执行解压。(map压缩)
为了减少输出,将reduce的结果进行压缩。(reduce压缩)
⑨文件存储格式
orc: 列式存储 testfile : 文本格式 Parquet:列式存储 二进制存储方式 注:数据压缩比例上ORC最优,相比textfile节省了50倍磁盘空间,parquet压缩性能也较好。 注:SQL查询速度而言,ORC与parquet性能较好 create table t1( id int ,name string ) partitioned by (day string) row format delimited fields terminated by '\t' stored as orc ;
3、分区与目录关联
案例:把数据直接先上传到HDFS的分区目录中,在让分区表与数据产生关联
1 上传数据后修复
1) 首先在HDFS上先创建一个目录,为如下结构
/user/hive/warehouse/dept_partition2/month=2/day=16
2) 上传数据到该目录中
dfs -put /data/dept.txt /user/hive/warehouse/dept_partition2/month=2/day=16;
3) 查询分区表,查看上传之后的数据
select * from dept_partition2 where month='2' and day='16'; //但是发现结果没有查询到任何数据
4) 执行修复命令,使HDFS上的数据与表结构相关联
msck repair table dept_partition2;
5) 再次查询分区表结果就可以查询到数据内容
select * from dept_partition2 where month='2' and day='16';
4、HIVE优化
三个方面: 、不执行mapreduce :Fetch抓取 、不用分布式去执行mapreduce :本地模式 、进行过滤 :严格模式 、多线程 :并行执行 、内存方面 :jvm重用 、开启推测执行 、合理设置map和reduce个数 ①Fetch抓取 一个简单的查询语句,是指一个没有函数、排序等功能的语句,当开启一个Fetch Task功能, 就执行一个简单的查询语句不会生成MapRreduce作业,而是直接使用FetchTask,从hdfs文件系统中进行查询输出数据,从而提高效率。 hive.fetch.task.conversion=more //hive-site中设置 ②本地模式 在hive的运行过程中,如果输入的数据量非常小,可以启动本地模式,在hive的本地节点上进行运行,不会提交任务到集群中。这样可以避免集群分配资源造成的时间浪费 等于说以前用集群,但是如果输入数据量小的话,可以只用一台机器去运行。 hive.exec.mode.local.auto=true; //hive-site中设置 hive.exec.mode.local.auto.inputbytes.max= //输入超过128M不能本地模式 ; //输入超过四个文件不能本地模式 ③表的优化 ) 大表在join小表的情况下,把小表放到join的左边,这样小表就会被缓存到map中,之后在进行大表的读取: ) 在进行join的时候尽量检查HQL语句,不要产生笛卡儿积 )数据的倾斜 合理设置map端的数量,通过切片的数量, 以及input目录中文件的数量来决定 当输入的数据存下很多小文件,小文件的数据远远小于128MB ,每个小文件都会被当成一个map任务输出, 而每个map的启动和初始化都是需要资源的,启动的任务,与要分析的任务的时长不成正比,会造成很大的资源浪费 合理的设置reduce数量 hive.exec.reducers.max= //reduce的个数 ④并行执行 Hive语句会把查询转换为多个阶段,抽样阶段,合并阶段,limit阶段。默认情况下hive只会一个任务执行一个阶段。 当某些任务不存在依赖关系时,可以开启并发执行 hive.exec.parallel=true; hive.exec.parallel.thread.number=; ⑤严格模式 hive.mapred.mode=strict; //nonstrict: 非严格模式 ) 对于分区表: 除非where语句中,包含分区字段的过滤条件,否则不让执行 ) 使用order by语句进行查询,必须包含limit 子句进行限制否则不让执行 ) 限制笛卡儿积的查询 ⑥JVM重用 对于MR任务执行的时候存在很多小文件,task任务启动就会很多,每个任务执行的时间都很短, JVM重用可以使得JVM实例在同一个JOB中重新使用N次。可以减少JVM的启动次数以及资源的消耗, <property> <name>mapreduce.job.jvm.numtasks</name> <value></value> //mapred-site文件中修改 </property> ⑦推测执行 原因:因为程序bug,负载不均衡或者资源分布不均,造成同一个job的多个task运行速度不一致,有的task运行速度明显慢于其他task。 解决:为该任务重新启动的一个,备份任务,与原来的任务一致,这两个任务同时运行,哪个任务先执行完毕,则以哪个任务为准。 前提: ) 每个task只能存在一个备份任务 ) 当前的job 必须完成task任务的5% 不适用: )任务出现了严重数据倾斜 )特殊的任务,reduce 把结果输出到数据库中 缺点:以空间换时间,当需要备份任务过多,只会更加拖累进程。当发生严重数据倾斜时,备份只会是火上浇油。
5、其他
①虚拟列 INPUT__FILE__NAME: //可以查询表中文件存储的位置 BLOCK__OFFSET__INSIDE__FILE: //表中文本中数据的偏移量 select id ,INPUT__FILE__NAME ,BLOCK__OFFSET__INSIDE__FILE from t1 注:开启之后能查出文件的存储位置和数据的偏移量信息 ② Hive Server2 注:将此HIVE开放,客户端能连 ) 启动hiveserver2的命令 bin/hiveserver2 ) 客户端连接命令 bin/beeline //首先使用beeline 命令进入到命令行模式 !connect jdbc:hive2://hadoop01:10000 hadoop sacsac //之后进行连接 链接之后,能执行HQL语句。 )API 通过写java代码,能执行HQL语句
2、sqoop
、Sqoop底层是使用mapreduce实现的,但是只是用到了map阶段,没有用到reduce阶段 思考:为什么sqoop使用mapreduce底层来实现? 答:Mapreduce是一个分布式计算框架,传输海量数据的时候效率更高 思考2:为什么sqoop只使用了map阶段没使用redue阶段? 答:Sqoop 仅仅是做数据传输,并涉及到计算,所以没有使用到redcue //导入import,导出export 、mysql---->hdfs create table to_hdfs( id int primary key not null, name varchar() not null ); insert into to_hdfs(id,name)values(,'tiantian'); //现在mysql中创建表to_hdfs和数据 insert into to_hdfs(id,name)values(,'xuewei'); insert into to_hdfs(id,name)values(,'xiaopang'); insert into to_hdfs(id,name)values(,'bangzhang'); sqoop import --connect jdbc:mysql://192.168.40.10:3306/test --username root --password root --table to_hdfs //连接mysql的test中的to_hdfs的数据 --target-dir /to_hdfs //导出到/to_hdfs文件夹下(自动创建) --fields-terminated-by '\t' \ //导出的文件分隔符为\t --num-mappers //map数量为1,导出成一个文件 //--delete-target-dir //如果输出目录存在则删除 sqoop import --connect jdbc:mysql://hadoop01:3306/test --username root --password root --table to_hdfs --fields-terminated-by '\t' --target-dir /to_hdfs2 --num-mappers --check-column id //检查列 --incremental append //是否是追加 --last-value //检查列的值 mysql中test数据库to_hdf表中id大于8的才会被追加到/to_hdfs2 下的文件中 、mysql----->hdfs sqoop import --connect jdbc:mysql://s10:3306/test --username root --password root --table to_hdfs --target-dir /to_hdfs3 --hive-import --hive-database hive_test --hive-table stu_info --num-mappers --fields-terminated-by '\t' 、hdfs----->mysql create table to_mysql( id int primary key not null, name varchar() not null ); sqoop export --connect jdbc:mysql://s10:3306/test --username root --password root --table to_mysql --export-dir /user/hive/warehouse/session_info/day= --num-mappers --input-fields-terminated-by '\t' 、job 当某些导入导出命令,经常用时,可以作为一个job保存。 sqoop job \ --create stu_info \ -- \ import --connect jdbc:mysql://hadoop01:3306/test \ --username root \ --password root \ --table to_hdfs \ --target-dir /to_hdfs4 \ --num-mappers sqoop job --list //查看已经创建的job列表 sqoop job --exec stu_info //执行job,需要输入mysql的密码
3-hive、sqoop的更多相关文章
- hive、sqoop、MySQL间的数据传递
hdfs到MySQL csv/txt文件到hdfs MySQL到hdfs hive与hdfs的映射: drop table if exists emp;create table emp ( id i ...
- 3.12-3.16 Hbase集成hive、sqoop、hue
一.Hbase集成hive https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration 1.说明 Hive与HBase整合在一起 ...
- [转]云计算之hadoop、hive、hue、oozie、sqoop、hbase、zookeeper环境搭建及配置文件
云计算之hadoop.hive.hue.oozie.sqoop.hbase.zookeeper环境搭建及配置文件已经托管到githubhttps://github.com/sxyx2008/clou ...
- Sqoop与HDFS、Hive、Hbase等系统的数据同步操作
Sqoop与HDFS结合 下面我们结合 HDFS,介绍 Sqoop 从关系型数据库的导入和导出. Sqoop import 它的功能是将数据从关系型数据库导入 HDFS 中,其流程图如下所示. 我们来 ...
- HIVE之 Sqoop 1.4.6 安装、hive与oracle表互导
1. sqoop数据迁移 1.1 概述 sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具. 导入数据:MySQL,Oracle导入数据到Hadoop的HDFS.HI ...
- 第3节 sqoop:4、sqoop的数据导入之导入数据到hdfs和导入数据到hive表
注意: (1)\001 是hive当中默认使用的分隔符,这个玩意儿是一个asc 码值,键盘上面打不出来 (2)linux中一行写不下,可以末尾加上 一些空格和 “ \ ”,换行继续写余下的命令: bi ...
- hadoop、hbase、hive、zookeeper版本对应关系
本文引用自:http://www.aboutyun.com/blog-61-62.html 最新版本: hadoop和hbase版本对应关系: Hbase Hadoop 0.92.0 1.0.0 ...
- Hadoop、Pig、Hive、Storm、NOSQL 学习资源收集
(一)hadoop 相关安装部署 1.hadoop在windows cygwin下的部署: http://lib.open-open.com/view/1333428291655 http://blo ...
- 开源作业调度工具实现开源的Datax、Sqoop、Kettle等ETL工具的作业批量自动化调度
1.阿里开源软件:DataX DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL.Oracle等).HDFS.Hive.ODPS.HBase.FTP等各种异构数据源之间稳 ...
- Hadoop 2.6.0-cdh5.4.0集群环境搭建和Apache-Hive、Sqoop的安装
搭建此环境主要用来hadoop的学习,因此我们的操作直接在root用户下,不涉及HA. Software: Hadoop 2.6.0-cdh5.4.0 Apache-hive-2.1.0-bin Sq ...
随机推荐
- encodeURIComponent编码与解码
问题:JavaScript用encodeURIComponentt编码后无法再后台解码的问题. 目前写法: window.self.location="list.jsp?searchtext ...
- 在Linux终端安装Julia
官方参考文档:https://julialang.org/downloads/platform.html#generic-binaries 一.centos终端安装 打开Linux终端输入 sudo ...
- SQL-41 构造触发器
题目描述 构造一个触发器audit_log,在向employees_test表中插入一条数据的时候,触发插入相关的数据到audit中.CREATE TABLE employees_test(ID IN ...
- Alpha冲刺9
前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/10034872.html 作业博客:https://edu.cnblogs.com/campus ...
- .NET并行计算和并发4-Thread-Relative Static Fields and Data Slots
Thread Local Storage: Thread-Relative Static Fields and Data Slots 文章摘自msdn library官方文档 可以使用托管线程本地存储 ...
- JavaScript 注意要点
何时加引号: 只有变量不加引号.加了引号的一定不是变量,是字符 方法: 方法一律带有小括号 js 中的作用域 全局变量: 在最外层定义的变量: 在函数体内部看是没有声明var的 也是全局 ...
- 在linux系统安装tomcat后,bin文件下startup.sh启动不
Linux里的tomcat下的 bin ,没法执行, 可直接到 bin 目录下 ,执行 chmod 777 * 就可以了. [srmdev@mvxl0793 bin]$ chmod 777 * ...
- 使用元类 编写ORM
元类 一句话: 元类定制类的创建行为 知识点 1.类的创建: python这种动态语言,函数和类的定义,不是编译时定义的,而是运行时动态创建的. Python解释器遇到class定义时,仅仅是扫描一下 ...
- winform获取EXE图片
winform获取EXE图片 using (FileStream fs = new System.IO.FileStream(n, FileMode.OpenOrCreate, FileAccess. ...
- Android开发中Activity状态的保存与恢复
当置于后台的Activity因内存紧张被系统自动回收的时候,再次启动它的话他会重新调用onCretae()从而丢失了之前置于后台前的状态. 这时候就要重写Activity的两个方法来保存和恢复状态,具 ...