我有一壶酒,足以慰平生。

0%

Hive学习笔记

Hive

数据仓库和数据库的区别

数据库:数据持久化操作(存储数据)。

数据仓库:对数据进行处理分析(没有增删改操作)。

image-20200713145956604

Java生成API文档

image-20200713150955522

Hive环境搭建

==hive是基于hadoop运行的,在搭建环境前必须保证hdfs环境可用。==

下载安装

hive官网

上传tar包至集群的namenode

解压安装命令如下:

1
tar -zxvf apache-hive......   -C /usr/loacal

修改配置

这篇文章

Hive表操作

正规建表

加载数据

内部表与外部表的区别

合并多个文件至一个文件

image-20200713164148216

Hive中的函数

HIve中的函数可以互相嵌套。

字符串截取substring

select substring(“asdasdas”,2,5);

第一个参数为截取字段,第二个字段为截取开始的下标,第三个字段为截取长度。

类型转化cast

select cast(被转化的字段 as 需要的类型)

例: select cast(age as int) a1;

数学运算函数

  1. 四舍五入

    • 取整

    select round(3.1415)

    • 保留小数

    select round(3.1415,3)

    参数为要四舍五入的数据

    image-20200714165617622

  2. 向上取整

    select ceil(3.14);

  3. 向下取整

    select floor(3.11);

  4. 取绝对值 (应用场景 时间戳)

    select abs(-11);

  5. 最大最小值

    select max(123,321);

    select min(123,321);

拼接字符串

select concat(“修改的内容”,“要添加的内容”);

select concat_ws(“1”,”2”);

两个参数可以互换位置。

字符串长度

select length(“asdasdasd”);

注:和编码集无关,有几个字母或汉字就返回几

字符串切分函数

select split(“要切分的字符串”,”切分的字符”);

大小写转化函数

应用场景:前后端数据交互事可能出现大小写不一致,在进行处理前统一大小写

  1. 转大写

    select upper(string str)

  2. 转小写

    select lower(string str)

时间转时间戳函数

select unix_timestamp(); //获取当前时间戳

select unix_timestamp(“2020-07-14”,”yyyy-MM-dd”);//获取到某天的时间戳

select unix_timestamp(“2020-07-14 11::11::11”,”yyyy-MM-dd HH::mm::ss”);//获取到某天某秒时间戳

select unix_timestamp(“2020-07-14 11::11::11::123”,”yyyy-MM-dd HH::mm::ss::SSS”);//获取到某天某秒时间戳

时间戳转时间

select from_unixtime(unix_timestamp());//获取当前时间

select from_unixtime(12312313212);

参数为一个时间戳。

条件控制函数

case when

case

when speed>= 30 and speed<60 then “低速”

when speed>= 60 and speed<100 then “中速”

when speed>= 100 and speed<150 then “高速”

when speed>= 150 then “超速”

if(判断体,true返回的内容,false返回的内容)

array_contains(“a”,”b”);

若a包含b返回true。

表生成函数

炸裂函数 explode(数组和集合)等价于for循环

select explode()

image-20200714152336298

行转列函数 及 表生成函数

image-20200714152757533

wordcount案例

数据链接

  1. 创建表

    先创建表存储wc.txt中的数据。

    1
    2
    create table wc(name string);
    //将所有的数据存为一条
  2. 数据处理

    1
    2
    select split(name,",") from wc;
    //使用","拆分数据。

    结果如下:

    image-20200714155930401

    可见数据被拆分成一个个数组,再使用炸裂函数(explode())对数据进行处理。

    1
    select explode(split(name,","))word  from wc;

    结果如下:

    image-20200714160255333

    再对数据进行进一步操作统计单词出现次数

    1
    2
    3
    4
    select ab.word,count(*)  from
    (select explode(split(name,","))word from wc)as ab
    group by ab.word;
    //嵌套查询,将上一步操作输出的结果作为下次查询的表 统计对应的单词出现次数。

    结果如下:

    image-20200714160709391

JSON解析函数

//{“movie”:”1193”,”rate”:”5”,”timeStamp”:”978300760”,”uid”:”1”}

创建临时表:

1
create table t_temp(json string);

加载数据:

1
load data local inpath '/root/json.txt' into table t_temp;

解析json数据:

1
select json_tuple(json,"字段名1","字段名2") as(表中的字段名1,表中的字段名2from t_temp;

创建正式表:

1
2
create table t_json as 
select json_tuple(json,"字段名1","字段名2") as(表中的字段名1,表中的字段名2from t_temp;

==json解析函数会自动转化数据类型。==

image-20200714164436125

image-20200714164528388

分析函数 row_number() over()

等价于分组topn

image-20200714172305550

row_number() over(partition by 字段 order by 字段 desc(降序))

任务:

image-20200714173230178

自定义函数

  1. 在idea下需要导入hive客户端的包

image-20200715140808438

  1. 开发一个java类 集成 (HIVE的父类 UDF) 写自己的方法

    实现横向比较最大值。

    image-20200715165214328

  2. 打成jar包,上传至服务器

image-20200715165242265

  1. 添加到hive中

    1
    add jar /root/hive_function.jar
  1. 创建一个临时函数

    1
    create temporay function  get_max as 'com.lcx.CustomDemo';
  1. 创建表

    1
    2
    create table t_custom(id string,jiben int,yeji int,guquan int)
    row format delimited fields terminated by ',';
  2. 临时函数只能在一次hive会话中有效

  3. 创建永久生效的方法

    • 将jar 包 放置 hive 安装目录下的lib下。

    • 创建永久函数。

      1
      create function  getmax as 'com.lcx.CustomDemo';
  4. 删除函数

    1
    drop function function_name;

案例

需要查询出每个人的三类收益中最高的是哪一种收益?

image-20200715165706678

  1. 自定义函数

  2. 上传至服务器

  3. 创建永久方法

  4. 写sql

    1
    2
    3
    4
    5
    6
    7
    select id,jiben,yeji,guquan,
    case
    when getmax(jiben,yeji,guquan)=1 then "基本工资"
    when getmax(jiben,yeji,guquan)=2 then "业绩提成"
    else "股权收益"
    end as tab
    from t_custom;
  5. 结果

    image-20200715170002271

Idea连接hive

先启动 hiveserver2

image-20200716165303070

去除json数据的[]

image-20200717150907903

别的知识点

sql中插入新字段

1
2
//alter table 表名 add 字段名 字段类型
alter table t_farm add crawl_time string

sql中 where 和 hiving的区别

where:在计算发生前排查数据

hiving:在计算完成后,不显示脏数据。==hiving 需要和group by 联合使用==

awk命令 文本编辑工具(截取字符串)

例子数据:

1
香菜,2.80,4.00,4.00,4.00,2.20,山西汾阳市晋阳农副产品批发市场,山西,汾阳

image-20200716152143114

sed命令 文本替换工具()

image-20200716153448035

image-20200716153509904

image-20200716153757225

PreparedStatement和Statement 的区别

Statement 和 PreparedStatement之间的关系和区别.
关系:PreparedStatement继承自Statement,都是接口
区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高

详细看这里

zeppelin安装

安装教程

相关截图

image-20200717155256219

启动命令:

image-20200718144959923

image-20200717172052796

开启metastore和hiveserver2服务

image-20200717192046295

hive –server metastore & hiveserver2

beeline

外界接入hive进行数据操作。

image-20200717172951163beeline -u jdbc:hive2://hadoop01:10000/db_user -n root -p 123456e

您的支持是我继续创作的动力