Hive基础(一)

一、Hive是什么

      Hive是基于Hadoop的一个数据仓库工具(离线),可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。,它能接收用户输入的sql语句,然后把它翻译成mapreduce程序对HDFS上的数据进行查询、运算,并返回结果,或将结果存入HDFS。

要点:HIVE利用HDFS来存储数据文件;利用MAPREDUCE来做数据分析运算;利用SQL来为用户提供查询接口;

 

二、Hive的安装及配置

1.1.用内嵌derby作为元数据库

      (1)安装hive的机器上应该有HADOOP环境(安装目录,HADOOP_HOME环境变量);(2)直接解压一个hive安装包即可此时,安装的这个hive实例使用其内嵌的derby数据库作为记录元数据的数据库此模式不便于使用。

1.2.将mysql作为元数据库

      以lunix安装为例:(1)上传mysql安装包;(2)解压;(3)安装mysql的server包;(4)安装mysql的客户端r包;(5)启动mysql的服务;(6)修改初始密码;(7)测试。注意点:要让mysql可以远程登录访问

2.修改hive的配置文件

      修改hive-site.xml配置文件:

<configuration>

<property>

<name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true</value>

</property>

 

<property>

<name>javax.jdo.option.ConnectionDriverName</name>

<value>com.mysql.jdbc.Driver</value>

</property>

 

<property>

<name>javax.jdo.option.ConnectionUserName</name>

<value>root</value>

</property>

 

<property>

<name>javax.jdo.option.ConnectionPassword</name>

<value>123456</value>

</property>

</configuration>

3.上传一个mysql的驱动jar包到hive的安装目录的lib中

4.配置HIVE_HOME到系统环境变量中:/etc/profile

5.source /etc/profile

6.hive启动

 

三、启动Hive的三种方式

1.启动一个hive交互式查询shell

      bin/hive

      hive>

2.启动hive的网络服务,然后通过一个客户端beeline去连接服务进行查询

      启动服务: bin/hiveserver2  

      启动客户端去连接hive服务:  bin/beeline -u jdbc:hive2://slave2:10000 -n root

3.启动hive以一个脚本的方式

    当有大量的hive查询任务时使用脚本化运行机制效率较高,该机制的核心点是:hive可以用一次性命令的方式来执行给定的hql语句。示例如下:

vi t_t.sh

#!/bin/bash

hive -e "insert into table t_max select id,max(age) from t_1 group by gender'"

hive -e 'create table t_sum as select id,sum(amount) from t_1 group by id'

 

 

 

四、Hive建库建表与数据导入(DDL)

1、建库:create database hello;    库目录:/user/hive/warehouse/hello.db

      hive中有一个默认的库:库名: default      库目录:/user/hive/warehouse

2、建表:

      内部表:表目录按照hive的规范来部署,位于hive的仓库目录/user/hive/warehouse中

                    create table t1(id int,name string,age int)

                    row format delimited fields terminated by ',';

       外部表:表目录由建表用户自己指定

                     create external table t2(id int,name string,age int)

                      row format delimited fields terminated by ','

                       location ‘/xx/xx/’;

注意:drop内部表时,表目录会被删除,表的元数据也会被删除

          drop外部表时,是表目录还在,但表的元数据会被删除

3、删除表

      drop table t1;

4、导入数据到表中

      实际上,只要把数据文件放入表目录即可           hadoop fs -put ......

      hive命令:

            如果文件在hive的本地磁盘: load data local inpath ‘/home/t_t.dat’ into table t1;

            如果文件在hdfs上:load data inpath ‘/t_t.dat’ into table t1;

      提醒:hive不会对用户所导入的数据做任何的检查和约束

5、修改表的定义

      修改表名:alter table table_name rename to new_table_name

            alter table t1 rename to t2;

      修改字段名、字段类型:alter table table_name change [column] col_old_name col_new_name column_type [commentcol_comment] [first|(after column_name)]

            alter table t1 change id oid float first;

      增加、替换列:alter table table_name add|replace columns (col_name data_type[comment col_comment], ...)

            alter table t1 add columns (gender string,phone int);

            alter table t1 replace columns (id int,age int,name string);

6、分区表

      在表目录中为数据文件创建分区子目录,以便于在查询时,mr程序可以针对指定的分区子目录中的数据进行处理,减少读取的范围,提高效率。

      内部表分区建表:

 

create table t1(id int,uid string,price float,amount int)

partitioned by (day string,city string)

row format delimited fields terminated by ',';

 

 

 

      已存在的文件夹作为表的一个分区,映射到表的分区:

alter table t2_ex add partition(day=’2018-11-25’) local ‘/2018-11-25’;

 

 

注意:分区字段不能是表定义中的已存在字段

      导入数据到指定分区:

load data [local] inpath '/home/t_t.txt' into table t2 partiton(day='2018-11-25',city='shengzheng');

 

 

      根据分区进行查询:

select count(*) from t2 where day='20170804' and city='shengzheng';

将分区字段当成表字段来用,就可以使用where子句指定分区了

 

 

 

7、根据已存在的表建表

      1、create table t_t2 like t _t1;    新建的 t_t2表结构定义与源表 t_t1一致,但是没有数据

      2、create table t_t2 as select id,name from t_t1;    根据select查询的字段来建表,将查询的结果插入新表中

8、将表中的数据导出到指定路径的文件

insert overwrite [local] directory '......'

row format delimited fields terminated by ','

select * from t1;

     

 

 

加local代表导入到本地磁盘文件,没加则代表导入到hdfs

 

五、SQL语法

      sql运算模型一:逐行运算模型(逐行表达式,逐行过滤)      例:select id,upper(name),age from t1;

      sql运算模型二:分组运算模型(分组表达式,分组过滤)   

            例:select id,avg(money) from t1 where money >=1000 group by gender having avg(age) <= 23;

      sql的join联表机制:join的实质是将多个表的数据连成一个表,作为查询的输入数据集,hive不支持不等值join

           笛卡尔积连接       例:select a.*,b.* from a join b;

           内连接       例:select a.*,b.* from a join b on a.id = b.id;

           左外连接:左表的数据全返回作为查询的输入数据集       例:select a.*,b.* from a left join b on a.id = b.id;

           右外连接:右表的数据全返回作为查询的输入数据集       例:select a.*,b.* from a right join b on a.id = b.id;

           全外连接:两表的数据全返回作为查询的输入数据集       例:select a.*,b.* from a full join b on a.id = b.id;

           左半连接:hive特有,按照内连接的规律链接,但只返回左半部分作为查询的输入集

            对select a.* from a where id in (select distinct id from b);

                 例:select id,name from a left semi join b on a.id = b.id;

      子查询:本质就是将一个select查询的结果集作为下一个查询的输入数据集

select a.city,a,city_sum

from

(select city,sum(price*amount) as city_sum

from t1

group by city) a

where a.city_sum>300;

   

 

  

 

 

      order by 排序:order by 永远写在一个select语句的最后,limit前; limit n :限制select返回的结果条数;

select city,sum(price*amount) as city_sum

from t1

group by city

order by city_sum asc

limit 2;

      

 

 

 

      in 过滤条件子句: select a.* from a where id in (select distinct id from b);

      distinct 去重关键字:distinct的前面不能再有表达式;distinct后面的表达式会被看成组合去重

六、数据类型

1、数字类型

      tinyint(1字节整数);smallint(2字节整数);int/integer (4字节整数);bigint(8字节整数);float(4字节浮点数);double (8字节双精度浮点数)

2、字符串类型

      string;varchar(20) (字符串1-65535长度,超长截断);char (字符串,最大长度255)

3、BOOLEAN(布尔类型)

      trune;false

4、时间类型

      timestamp(时间戳) (包含年月日时分秒毫秒的一种封装);date (日期)(只包含年月日)

5、array数组类型

     array<data_type> 

6、map类型

      map<primitive_type, data_type> 

7、struct类型

       struct<col_name : data_type, ...>

      用一个字段来描述整个用户信息,可以采用struct

 

七、常用内置函数

1、类型转换函数

select cast("10" as int) ;

select cast("2018-11-25" as date) ;

select cast(current_timestamp as date);

 

 

 

 

2、数学运算函数

select round(2.5);   ## 3  四舍五入

select round(2.2315,3) ;  ##2.231

select ceil(2.2) ; // select ceiling(2.2) ;   ## 3  向上取整

select floor(2.2);  ## 2  向下取整

select abs(-2.2) ;  ## 2.2  绝对值

select greatest(id1,id2,id3) ;  ##  单行函数,多个输入参数中的最大值

select least(2,3,7) ;  ##单行函数,求多个输入参数中的最小值

 

 

 

 

 

3、字符串函数

upper(string str)  ##转大写

lower(string str)  ##转小写

substr(string str, int start)   ## 截取子串

substring(string str, int start)

substr(string, int start, int len)

substring(string, int start, int len)

concat(string A, string B...)  ## 拼接字符串

concat_ws(string SEP, string A, string B...)

length(string A)

split(string str, string pat)  ## 切分字符串,返回数组

注意:select split("192.168.33.44",".") ; 错误的,因为.号是正则语法中的特定字符

select split("192.168.33.44","\\.") ;

 

 

 

 

 

 

 

 

 

 

4.时间函数

select current_timestamp; ## 返回值类型:timestamp,获取当前的时间戳(详细时间信息)

select current_date;   ## 返回值类型:date,获取当前的日期

unix时间戳转字符串格式——from_unixtime

from_unixtime(bigint unixtime[, string format])

示例:select from_unixtime(unix_timestamp());

select from_unixtime(unix_timestamp(),"yyyy/MM/dd HH:mm:ss");

字符串格式转unix时间戳——unix_timestamp:返回值是一个长整数类型

如果不带参数,取当前时间的秒数时间戳long--(距离格林威治时间1970-1-1 0:0:0秒的差距)

select unix_timestamp();

unix_timestamp(string date, string pattern)

示例: select unix_timestamp("2018-11-25 10:00:00");

select unix_timestamp("2018-08-10 10:00:00","yyyy-MM-dd HH:mm:ss");

将字符串转成日期date

select to_date("2018-11-25 10:00::00");

 

 

 

 

 

 

 

 

 

5、条件控制函数

      if          select id,if(age>18,'male','children') from t1;

      case when

            case  

                  when condition1 then result1

                  when condition2 then result2

                  ...

                  when conditionn then resultn

            end

6、聚合函数

array(5,4,6,1)   构造一个整数数组

array(‘hello’,’hi’,’nihao’)   构造一个字符串数组

array_contains(Array<T>, value)  判断是否包含,返回boolean值

sort_array(Array<T>) 返回排序后的数组

size(Array<T>)  返回一个集合的长度,int值

size(Map<K.V>)  返回一个imap的元素个数,int值

size(array<T>)   返回一个数组的长度,int值

map_keys(Map<K.V>)  返回一个map字段的所有key,结果类型为:数组

map_values(Map<K.V>) 返回一个map字段的所有value,结果类型为:数组

 

 

 

 

 

 

7、常见分组聚合函数

sum(字段)  :  求这个字段在一个组中的所有值的和

avg(字段)  : 求这个字段在一个组中的所有值的平均值

max(字段)  :求这个字段在一个组中的所有值的最大值

min(字段)  :求这个字段在一个组中的所有值的最小值

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 926. 将字符串翻转到单调递增(动态规划)

文章目录1. 题目2. 解题1. 题目 如果一个由 0 和 1 组成的字符串&#xff0c;是以一些 0&#xff08;可能没有 0&#xff09;后面跟着一些 1&#xff08;也可能没有 1&#xff09;的形式组成的&#xff0c;那么该字符串是单调递增的。 我们给出一个由字符 0 和 1 组成的字符串…

利用Jqurey写一个输入内容增加并且可以删除,上下移动的标签

最终结果如下&#xff0c;输入内容增加标签并且可以删除&#xff0c;上下移动&#xff1a; 代码赏析&#xff1a; <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>todolist</title><style type…

java的注释、关键字、标识符、变量常量、数据类型、运算符、流程控制等

java的注释、关键字、标识符、变量常量、 数据类型、运算符、流程控制等 1. java概述 1.1 java的技术体系 Java SE&#xff1a;是Java的标准版&#xff0c;提供了完整的java核心API。 Java EE&#xff1a;是Java的企业版&#xff0c;主要用于开发…

LeetCode 851. 喧闹和富有(拓扑排序)

文章目录1. 题目2. 解题1. 题目 在一组 N 个人&#xff08;编号为 0, 1, 2, ..., N-1&#xff09;中&#xff0c;每个人都有不同数目的钱&#xff0c;以及不同程度的安静&#xff08;quietness&#xff09;。 为了方便起见&#xff0c;我们将编号为 x 的人简称为 "perso…

Jquery练习题—实现分组添加功能

实现分组添加功能&#xff1a; <title>Insert title here</title> <script type"text/javascript" src"js/jquery-1.12.4.min.js"></script> <script type"text/javascript"> $(function(){ //需求1&#xff1a;…

PostgreSQL参数学习:vacuum_defer_clean_age

官方文档&#xff1a; http://www.postgresql.org/docs/9.3/static/runtime-config-replication.html 为了防止slave端读取数据时&#xff0c;因为读到的是旧有数据而被强制取消&#xff0c;设定了这么一个以transaction为单位的值。 就是可以保证经过这么多的trsanction后&…

java的常用引用类、数组、String类

java的常用引用类、数组、String类 1. 常用引用类 1.1 Scanner 一个简单的文本扫描器类。 使用&#xff1a; //创建扫描器对象 Scanner sc new Scanner(System.in); //接收用户输入字符串类型的数据 String str sc.next(); //接收用户输入整数类型的数据 …

json-ajax-jsonp-cookie

json json是 JavaScript Object Notation的首字母缩写&#xff0c;单词的意思是javascript对象表示法&#xff0c;这里说的json指的是类似于javascript对象的一种数据格式&#xff0c;目前这种数据格式比较流行&#xff0c;逐渐替换掉了传统的xml数据格式。 json是轻量级,易解…

LeetCode 981. 基于时间的键值存储(哈希+二分查找)

文章目录1. 题目2. 解题1. 题目 创建一个基于时间的键值存储类 TimeMap&#xff0c;它支持下面两个操作&#xff1a; set(string key, string value, int timestamp) 存储键 key、值 value&#xff0c;以及给定的时间戳 timestamp。 get(string key, int timestamp) 返回先…

java的类与对象

java的类与对象 1 面向对象 1.1 面向对象与面向过程的区别 面向过程和面向对象都是解决问题的逻辑方法&#xff0c;面向过程是强调解决问题的步骤&#xff0c;可以先定义多个函数&#xff0c;在使用的使用调用函数即可&#xff1b;面向对象把问题分解成多个对象&#xff0c;…

学车总结

学车总结&#xff1a; 1、左脚离合&#xff0c;右脚油门和刹车。2、左脚脚跟着地&#xff0c;用脚尖控制离合。3、踩离合要快&#xff0c;松要慢点&#xff1b;刹车刚好相反。4、平时不要猛打方向盘&#xff0c;轻微调整就行&#xff0c;需要拐急弯要降低车速。5、换挡时需要将…

建设网站需要的Bootstrap介绍与操作

01-流体布局 流体布局,就是使用百分比来设置元素的宽度,元素的高度值固定, calc()&#xff1a;可以通过计算的方式给元素添加尺寸,比如:width:calc(25%-4px); box-sizing&#xff1a;content-box默认的盒子计算方式 2.border-box 盒子的计算方式从边框开始,盒子的尺寸,边框和…

04.卷积神经网络 W4.特殊应用:人脸识别和神经风格转换

文章目录1. 什么是人脸识别2. One-Shot学习3. Siamese 网络4. Triplet 损失5. 人脸验证与二分类6. 什么是神经风格迁移7. 深度卷积网络在学什么8. Cost function9. Content cost function10. Style cost function11. 一维到三维推广作业参考&#xff1a;吴恩达视频课深度学习笔…

java的封装,继承,多态

java的封装&#xff0c;继承&#xff0c;多态 1 封装 1.1 封装 指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。封装可以被认为是一个保护屏障&#xff0c;防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据&#xff0c;必须通过严格的…

详解一个自己原创的正则匹配IP的表达式

第一种方法&#xff08;可以匹配有点毛病&#xff09;&#xff1a;检测IP地址的正则表达式 正则表达式&#xff1a; ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) 红色块代…

亚洲赛前训练计划

回顾和加深所学算法。 主要回顾用途及使用方法。 图论方面&#xff1a; 1.dfs,bfs 2.强连通&#xff0c;点双连通&#xff0c;边双连通&#xff0c;2-sat 3.匈牙利算法km,以及不等式解 4.网络流&#xff0c;费用流 5.最短路&#xff0c;SPFA&#xff0c;dijstra, floay,斯坦纳树…

天池在线编程 2020年9月26日 日常周赛题解

文章目录1. K步编辑2. 折纸3. 字符串的不同排列4. 硬币排成线题目地址&#xff0c;请点这 1. K步编辑 给出一个只含有小写字母的字符串的集合以及一个目标串(target)&#xff0c;输出所有可以经过不多于 k 次操作得到目标字符串的字符串。 你可以对字符串进行一下的3种操作:…

JavaScript试题练习题

1. 我们可以在下列哪个HTML元素中放置javascript代码&#xff1f; A.< script > B.<javascript > C.< js > D.<scripting > ★标准答案&#xff1a;A 2. 预测以下代码片段的输出结果: var str alert(typeof str); A.. string B..un…

Java的static,final,代码块,内部类,抽象类,接口等

Java的static&#xff0c;final&#xff0c;代码块&#xff0c;内部类&#xff0c;抽象类&#xff0c;接口等 1 static关键字月final关键字 1.1 static static表示静态。可以修饰属性&#xff0c;方法&#xff0c;代码块内部类等&#xff0c;总结如下&#xff1a; 特点修饰属…

使用parted划分GPT分区(转)

parted命令可以划分单个分区大于2T的GPT格式的分区&#xff0c;也可以划分普通的MBR分区&#xff0c;fdisk命令对于大于2T的分区无法划分&#xff0c;所以用fdisk无法看到parted划分的GPT格式的分区。 Parted 命令分为两种模式&#xff1a;命令行模式和交互模式。 1、命令行模式…