Hive官网手机游戏 hive官网中文版

您所在的位置:网站首页 hive智能手机游戏天堂有哪些游戏 Hive官网手机游戏 hive官网中文版

Hive官网手机游戏 hive官网中文版

2024-07-04 11:28| 来源: 网络整理| 查看: 265

Hive

Hive是一种用于执行离线计算的数据仓库工具,基于Hadoop的HDFS与MR实现。

Hive偏重于数据的分析和处理,使用映射关系将结构化的数据映射为表的结构。

例如:基于数据(1,zhangsan,123456,男)对应生成(id+uname+pwd+sex)的映射

Hive不会直接影响原始数据的结构,而hbase需要将数据存到hbase数据库才能查找数据。

Hive能够实现非Java用户对HDFS数据的MR操作。

官网:http://hive.apache.org

数据仓库分为OLAP联机分析处理,OLTP联机事务处理通过对以往数据的分析,对现有和未来业务提供数据支持对数据处理分为:OLAP联机事务处理,负责数据事务处理,关系型数据库的主要应用OLAP联机分析处理,负责数据分析处理,数仓的主要应用数仓中的数据模型包括:星型模式(单一中心节点)雪花模型(一个中心节点多个分支节点)星系模型(多中心节点)数仓基本用于执行对数据的查找和统计,一般不会删除数据或修改数据详细参考:https://zhuanlan.zhihu.com/p/67446501Hive架构client客户端包括三种方式命令行模式——直接通过HQL(Hive Sql)执行操作JDBC/ODBC模式——通过java代码操作,需借助ThriftServer将代码转为HQLWebUI——通过web端输入HQL,远程执行任务MetaStore元数据存储器,用于存储Hive建表语句,也就是描述Hive与数据的映射关系的数据元数据包括:表,表的列、分区、属性、表的属性,表的数据所在目录元数据会存放在关系型数据库中(mysql)Driver解析器——将hql解析为语法树编译器——将语法树转换为逻辑执行计划优化器——重写逻辑执行计划实现优化执行器——将逻辑执行计划转换为物理执行计划(MR-JOB)基于Hadoop-Yarn+Mapredce+Hdfs执行物理执行计划Hive搭建前提:mysql与Hadoop安装完成在mysql中添加一个库用于存放Hive的映射create database hive_single;将安装包解压到指定位置tar -zxvf apache-hive-1.2.1-bin.tar.gzcp -r apache-hive-1.2.1-bin /opt/sxt/mv apache-hive-1.2.1-bin hive-1.2.1修改配置文件cp hive-default.xml.template hive-site.xml删除原始内容中configuration标签下的内容(3891行)填入如下内容 hive.metastore.warehouse.dir /hive_single hive.metastore.local true javax.jdo.option.ConnectionURL jdbc:mysql://localhost:3306/hive_single?createDatabaseIfNotExist=true javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver javax.jdo.option.ConnectionUserName root javax.jdo.option.ConnectionPassword 123456 拷贝mysql的jar包到lib目录(mysql-connector-java-5.1.32-bin.jar)解决Hadoop与Hive的jar版本差异(将jline文件替换)cd /opt/sxt/hadoop-2.6.5/share/hadoop/yarn/lib/rm -rf jline-0.9.94.jarcp /opt/sxt/hive-1.2.1/lib/jline-2.12.jar ./配置PATHvim /etc/profileexport HIVE_HOME=/opt/sxt/hive-1.2.1export PATH=$HIVE_HOME/bin:$PATH(注意加上其他软件的路径)source /etc/profileHive启动命令:hive查看库命令show databases;创建库create database myhive;使用库use myhive;创建表create table user;保存快照Hive-SQLHQL语句结尾要加分号;进入命令行 hive清空页面 !clear;DDL用于执行数据库组件的定义(创建修改删除)DDL需要注意库,表字段命名的规范DDL官方文档https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL数据类型基本类型整型int(4byte)tinyint(1bety)smallint(2byte)bigint(8byte)浮点型double(8byte)float(4byte)字符型stringchar(定长)varchar(不定长)boolean型true/false (1位)时间型timestamp时间戳date日期 类型转换自动整型隐式转为范围大的整型所有整型,float,string可以隐式转为doubleint,tinyint,smallint能转为doubledouble不能转型为其他数据类型强制例如:cast('1' as int)表设计时须设置合适的数据类型避免类型转型引用/复合类型

由基本类型构成,复合类型可以相互嵌套

Array存放相同类型的数据以索引排序,索引从0开始获取数据的格式为:user[0]Map存储任意数量的键值对,适用属性的数量和类型均不确定的情况通过key取值,map['key1']key不能相同,相同的key会相互覆盖Struct结构体,内部的属性与属性的类型固定通过属性获取值:info.name(获取info结构体中name的属性)DDL库操作创建数据库create database sxt;create database if not exists sxt; create database sxt location '/hive_single/sxt_path' 指定数据库在hdfs的路径(路径名与数据库名可不同,创建时不会将原路径数据清除)删除数据库drop database if exists sxt cascade; 删除库,并将库所在文件夹删除drop database sxt ;删除空库使用数据库 use sxt ;查看数据库show databases;查看所有数据库名show databases like 's*'; 匹配查找数据库desc database sxt;查看库内的表修改数据库(了解)无法修改数据库名和数据库所在路径。只能修改其他数据alter database sxt set dbproperties('createtime'='20170830');DDL表创建external 是否是外部表,不加该关键字则默认内部表定义每一列所有列在括号内,相互通过逗号分隔(col_name data_type [COMMENT col_comment], ...)普通列: name string数组: books array< string>map: score mapstruct: info struct< name:String,age:int>COMMENT col_comment 列注释COMMENT table_comment 表注释分区[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 分桶[CLUSTERED BY (col_name, col_name, ...) ][SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 每一行的数据切分方式 ROW FORMAT row_format 字段分隔,array分隔,结构体与map的K-V分隔符,行分隔符注意顺序不能改变默认行以\n分隔,可以省略ROW FORMAT delimited fields terminated by ',' collection items terminated by '_' map keys terminated by ':' lines terminated by '\n';数据存储格式STORED AS file_format 用于数据压缩等情况数据文件的地址LOCATION hdfs_path 内部表和外部表均能指定表HDFS路径,LOCATION 是一个文件夹location '/hive_single/sxt';CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name (col_name data_type [COMMENT col_comment], ...) [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) ] [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [ROW FORMAT row_format] [STORED AS file_format] [LOCATION hdfs_path]

实例:

文本格式: songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing json格式: { "name": "songsong", "friends": ["bingbing" , "lili"] , //列表Array, "children": { //键值Map, "xiao song": 18 , "xiaoxiao song": 19 } "address": { //结构Struct, "street": "hui long guan" , "city": "beijing" } }create table person( name string, friends array, children map, address struct ) row format delimited fields terminated by ',' collection items terminated by '_' map keys terminated by ':' lines terminated by '\n'外部表与内部表

表默认为内部表,使用external则为外部表

表创建时都不会将已有文件夹中的数据清除。

内部表

内部表处理独享的数据,适用于单次处理的数据,不适合于其他工具共享数据删除表时表路径中的原始数据也会删除,若指定location的内部表会将location的一级目录删除

外部表

定义表可定义location路径,实现和其他表共享数据文件删除外部表时只删除元数据信息,location目录下的数据将被保留create external table person(name string) location '/myhive/sxt';

内外表切换

alter table sxt set tblproperties('EXTERNAL'='TRUE'); 内转外alter table sxt set tblproperties('EXTERNAL'='FALSE'); 外转内表删除与清空表删除(外部表不清除原始数据)drop table [if exsits] t_user;清空表数据,直接截断truncate table_name;查看表结构desc table_name ;

表修改(了解)

改表名alter table t_oldName rename to t_newName; 内部表会将对应文件目录名修改,若指定了location则将location原目录移动到默认路径下外部表不会影响location地址的数据,不指定location也不会对默认路径进行修改更新列alter table table_name change [column] col_oldName col_newName column_type [column col_comment] [FIRST|AFTER column_name];增加替换列alter table table_name add|replace columns(col_name data_type [备注], ...);数据载入load载入

load data [local] inpath '/root/path' [overwrite] into table table_name

local,表示路径为linux路径,否则默认为HDFS路径overwrite,表示覆盖载入,将表文件中原有的数据覆盖,否则默认为追加load 加载不执行MR操作local文件将被复制到HDFS的表目录中,HDFS文件则剪切到表目录。insert载入

insert会启动MR操作,一般用于将原表的查询结果插入到新表中。

overwrite(覆盖) 和 into(追加),可以相互替换

单表插入

insert overwrite table t2 select xxx from t1;(将表1的xxx字段插入表2中)

多表插入

from t1 insert overwrite table t2 select xxx1insert overwrite table t3 select xxx2; (将表1的xxx字段插入表2中)

单记录插入(一般不这么做)

insert into t1 values ('id','5'),('name','zhangwuji');表数据导入导出

计算导出

通过insert将查询结果保存为数据文件,执行了MR操作且只保存数据文件

insert overwrite local directory '/root/data_out' row format delimited fields terminated by '-' select * from mytable;

加入local表示导出到本地 linux的文件路径中,不加location则表示导出到HDFS的文件路径中

row format部分表示输出数据的间隔方式,与表定义类似

直接导出

导出,将表数据及表结构指定hdfs路径下,在该路径下保存元数据文件与数据文件夹。export table t_name to '/hdfs_path'导入,将文件夹导入到命名空间,直接在命名空间下生成导出的表及数据import from '/hdfs_path' 恢复后的文件夹名与表名相同,表自生属性也被保留(外部表属性,内部字段等)分区

为了减少全表扫描查询的问题,根据指定字段的值,对数据进行分区存储(分多个文件夹存储)

定义分区表--定义分区表时,可以指定多个分区属性 create table t_name(id int,name string) partitioned by (addr string , work string) row format delimited fields terminated by ',';

分区层级分为:单分区和多分区

单分区:只有一种分区。按照单一属性值分区多分区,包含存在父子关系的多种分区。先依据父级属性分区,再依据子级属性分区

分区操作

添加分区alter table t_name add partition(column='xxx');删除分区 alter table t_name drop partition(column='xxx');查询分区 show partitions t_name;静态分区

数据载入

load data [local] inpath '/path' into table 't_name' partition (column1='xxx',column2='yyy');

静态载入的数据,会复制到对应的分组文件夹下,若无则自动创建文件夹。

数据只能载入到一个文件夹中,且查询时hive直接从文件夹中取数据,不再对分组字段处理。若文件中存在分组字段实际数据与分组数据不匹配,也将该字段值视为指定的分组数据。

动态分区开启动态分区指定如下set hive.exec.dynamic.partition=true;set hive.exec.dynamic.partition.mode=nonstrict;开启动态分区后再创建主分区表create table table1( id int, name string ) partitioned by (novel string,sect string) row format delimited fields terminated by ',' ;创建外部临时表,临时表的字段与主分区表字段相同,临时表的location指向数据源create external table table2 ( id int, name string, novel string, sect string ) row format delimited fields terminated by ',' location '/path' ;使用insert语句通过临时表将数据载入主表,期间执行的MR操作insert overwriter table table1 partition(novel,sect) select id,name,novel,sect from table2;分桶

根据指定的列,对列值hash计算,根据结果将数据存入对应桶,能够将数据有效散列到桶中。分桶需要执行MR,桶的数量与reduce相同,计算结果输出到对应的桶文件中。

效果:使得桶中的数据较为均匀,便于统计计算。相同的key必然在一个桶中,降低表连接的数量。

数据插入:依赖于insert方式的数据插入。

指定列需要满足:经常被查询,自身散列较好分桶可以在分区的基础上执行分桶的数据需要具备较多的公约数,便于查询(12的公约数:1,2,3,4,6)

分桶建表语句

create table table01( id int ,name string,age int) clustered by (name) sorted by (age) into 6 buckets ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; --说明 按照name属性分桶,桶内通过age实现排序

分桶表的取样SQL

tablesample(bucket x out of y on 分桶列 )

第二个参数表示将桶分为多少组,其为分桶数的公约数第一个参数表示每个组中取几个桶进行计算参数1不大于参数2select * from table01 tablesample(bucket 1 out of 3 on name );复杂映射建表

通过正则将列与复杂数据进行映射,能够匹配复杂文本

--基本格式 create table table_name(column type,...) row fromat serde 'org.apache.hadoop.hive.serde2.RegexSerDe' with serdeproperties("input.regex" ="正则")

正则中每个括号内的部分对应前面定义的列

例子如下:

原始文件格式: 192.168.57.4 - - [29/Feb/2016:18:14:35 +0800] "GET /bg-upper.png HTTP/1.1" 304 - 192.168.57.4 - - [29/Feb/2016:18:14:35 +0800] "GET /bg-nav.png HTTP/1.1" 304 - 192.168.57.4 - - [29/Feb/2016:18:14:35 +0800] "GET /asf-logo.png HTTP/1.1" 304 ---建表语句 create table t_log( host string, identity1 string, identity2 string, time string, request string, referer string, agent string,) row fromat serde 'org.apache.hadoop.hive.serde2.RegexSerDe' with serdeproperties( "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) \\[(.*)\\] \"(.*)\" (-|[0-9]*) (-|[0-9]*)" )映射说明: 括号内的内容匹配每个列,对应关系如下 host 192.168.57.4 identity1 - identity2 - time 29/Feb/2016:18:14:35 +0800 request GET referer /bg-upper.png HTTP/1.1 agent 304DQL语句SQL 语言大小写不敏感。 SQL 可以写在一行或者多行关键字不能被缩写也不能分行各子句一般要分行写,注意tab键会导致命令异常

Hive SQL的使用和数据库SQL基本上是一样的

主要语法表连接支持99语法排序sorted by 对deduce数据的数据进行排序order by 对全部数据进行排序分页 limit x 展示前x行记录,与排序组合实现展示最大(小)值limit x,y 展示x-y行记录组函数max min avg sum count 组函数一般与group by组合使用选择函数nvl(obj,default) 单行选择函数相当于obj==null?default:obj,若obj为空则取默认值,否则取自身的值非关系型数据库DQL

split(column,'-') 将字段分隔为数组,以某个字符串作为间隔

explode(split(column,'-)) 将分割的数组展开,但不能直接与普通列同时使用

lateral view explode(split(column,'-)) typeTable as xxx 将列展开成表,再与普通列出现在一行

--数据 nezha js,gx,qq,dm meirenyu gx,kh,aq xingjidazhan kh,js huoyingrenzhe dm,qj,yq,aq --表 create table t_movie( name string,type string) row format delimited fields terminated by ' '; --查询 select name,xxx from t_movie lateral view explode(split(type,',')) tempTable as xxx;内置函数

内置运算符

关系运算符 A = B;A is null;A like B返回boolean算数运算法+,-,*,/,%,|,^,~ 适用于数值计算逻辑运算符and,or,not,&&,|,!适用于布尔值运算复杂函数定义map(k1,v1,k2,v2...)struct(v1,v2,v3...)array(v1,v2,v3)操作A[n] 数组A的第n个元素,从0开始M['key'] 数组M中key对应的值S.x 结构体S中的x属性值

内置函数

数字函数数值计算相关函数,包括取值,随机,转进制,绝对值...字符串函数长度,分割split,连接,大小写,去空格...collection函数size(数组/map) 获取长度转型函数cast(值 as 目标类型)日期函数与字符串转换,日期的计算相关条件函数if(boolean,value1,value2)

内置聚合函数UDAF

count,sum,avg,min,max;求方差,差值等;collect_set(col)返回无重复的数据

内置表生成函数UDTF

explode(array) 拆分数组

自定义函数

由于内置函数不满足我们的需要,需要自定义函数。(自定义代码实现对指定的数据进行运算,返回所需的结果,中间可以使用java的类库实现复杂操作)

UDF(User-Defined-Function) 一进一出UDAF(User- Defined Aggregation Funcation) 聚集函数,多进一出UDTF(User-Defined Table-Generating Functions) 一进多出(了解)

注意:在IDE工具中导入hive依赖jar包 (D:\BigData\课件及软件\第6阶段:Hadoop 离线体系:Hive\软件\apache-hive-1.2.1-bin\lib)

以下函数均使用临时函数命令

 

UDF函数创建项目,导入hive的jar包,创建java类继承org.apache.hadoop.hive.ql.exec.UDF实现public String evaluate(Object value...)方法,该方法为重载方法,可以传入任意类型数据将项目打成jar文件上传至linux系统hive客户端中,清空以前的同名文件,将上传的文件添加到hive函数库中delete jar /root/xxx.jaradd jar /root/xxx.jar给自定义函数建名称,指定到对应的自定义java类create temporary function xxx as 'com.jay.Xxx' 使用函数select xxx(empno),xxx(emane) from t_emp;销毁函数drop temporary function xxx;

自定义函数代码

package com.jay; import org.apache.hadoop.hive.ql.exec.UDF; //自定义UDF函数 public class Myudf extends UDF{ //单个参数处理 public String evaluate(String value){ return value+"xxx";} //多参数处理 public String evaluate(String value1,int value2 ){ return value1+"-"+value2;} }UDAF函数创建项目,导入hive的jar包,创建java类继承org.apache.hadoop.hive.ql.exec.UDAF创建静态内部类,实现org.apache.hadoop.hive.ql.exec.UDAFEvaluator重写init方法,该方法至执行一次boolean iterate(Object) 迭代器Object terminatePartial() 临时结果输出boolean merge(Object) 执行合并操作Object terminate() 最终结果输出

调用说明(根据需求调用以上方法)

map过程调用iterate与terminatePartial;

combiner(map合并)调用merge和terminatePartial

reduce调用merge与terminate

其他步骤与HDF相同,调用UDAF会执行MRimport org.apache.hadoop.hive.ql.exec.UDAF; import org.apache.hadoop.hive.ql.exec.UDAFEvaluator; public class Myudaf extends UDAF{ public static class aaa implements UDAFEvaluator{ //定义一个中间量,执行所需业务 private int sum; @Override public void init() { System.out.print("初始化,只执行一次"); } //迭代处理原始数据 public boolean iterate(String value) { if (value != null) sum += value.length(); return true; } //临时输出 public int terminatePartial() { return sum;} //合并 public boolean merge(int tmpSum) { sum += tmpSum; return true;} //最终输出 public String terminate() { return "sum:" + sum;} } }hive优化

在优化中主要关注

Map的数量,reduce数量,文件数量,切片大小

hive中修改配置属性语句为:set xxx=值;

理解HSQL的执行

表连接

select u.name, o.orderid from order o join user u on o.uid = u.uid

注:uid作为key进行MR

Hive官网手机游戏 hive官网中文版_hive

表分组及分组函数

select rank, isonline, count (*) from city group by rank , isonline

注:将rank -isonline作为key

Hive官网手机游戏 hive官网中文版_Hive_02

表分组去重

select dealid, count(distinct uid) num from order group by dealid

注:根据dealid执行map之后的分区,根据分区的dealid+去重的uid执行reduce的分组

Hive官网手机游戏 hive官网中文版_数据_03

表多重去重

select dealid, count(distinct uid), count(distinct date) from order group by dealid

方式1:只能在reduce中去重

Hive官网手机游戏 hive官网中文版_Hive_04

方式2:实现在map中去重

Hive官网手机游戏 hive官网中文版_Hive官网手机游戏_05

Map表连接优化指定大表和小表。减少了全表连接的数量执行过程:小表节点先执行map,结果载入到hashtable中,各大表节点启动map并将小表执行结果载入内存,在各大表节点执行map合并,再将数据写出到reduce处理。select * from a join b join c; 控制a


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3