HIVE的高级操作

二、视图

1、Hive 的视图和关系型数据库的视图区别

和关系型数据库一样,Hive 也提供了视图的功能,不过请注意,Hive 的视图和关系型数据库的数据还是有很大的区别:

  (1)只有逻辑视图,没有物化视图;

  (2)视图只能查询,不能 Load/Insert/Update/Delete 数据;

  (3)视图在创建时候,只是保存了一份元数据,当查询视图的时候,才开始执行视图对应的 那些子查询

2、Hive视图的创建语句

create view view_cdt as select * from cdt;

3、Hive视图的查看语句

show views;
desc view_cdt;-- 查看某个具体视图的信息

4、Hive视图的使用语句

select * from view_cdt;

5、Hive视图的删除语句

drop view view_cdt;

三、函数

1、内置函数

具体可看http://www.cnblogs.com/qingyunzong/p/8744593.html

(1)查看内置函数

show functions;

(2)显示函数的详细信息

desc function substr;

(3)显示函数的扩展信息

desc function extended substr;

2、自定义函数UDF

当 Hive 提供的内置函数无法满足业务处理需要时,此时就可以考虑使用用户自定义函数。

UDF(user-defined function)作用于单个数据行,产生一个数据行作为输出。(数学函数,字 符串函数)

UDAF(用户定义聚集函数 User- Defined Aggregation Funcation):接收多个输入数据行,并产 生一个输出数据行。(count,max)

UDTF(表格生成函数 User-Defined Table Functions):接收一行输入,输出多行(explode)

(1) 简单UDF示例

A. 导入hive需要的jar包,自定义一个java类继承UDF,重载 evaluate 方法

ToLowerCase.java

import org.apache.hadoop.hive.ql.exec.UDF;

public class ToLowerCase extends UDF{

    // 必须是 public,并且 evaluate 方法可以重载
    public String evaluate(String field) {
    String result = field.toLowerCase();
    return result;
    }

}

B. 打成 jar 包上传到服务器

C. 将 jar 包添加到 hive 的 classpath

add JAR /home/hadoop/udf.jar;

D. 创建临时函数与开发好的 class 关联起来

0: jdbc:hive2://hadoop3:10000> create temporary function tolowercase as ‘com.study.hive.udf.ToLowerCase‘;

E. 至此,便可以在 hql 在使用自定义的函数

0: jdbc:hive2://hadoop3:10000> select tolowercase(‘HELLO‘);

(2) JSON数据解析UDF开发

现有原始 json 数据(rating.json)如下

{"movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"}

{"movie":"661","rate":"3","timeStamp":"978302109","uid":"1"}

{"movie":"914","rate":"3","timeStamp":"978301968","uid":"1"}

{"movie":"3408","rate":"4","timeStamp":"978300275","uid":"1"}

{"movie":"2355","rate":"5","timeStamp":"978824291","uid":"1"}

{"movie":"1197","rate":"3","timeStamp":"978302268","uid":"1"}

{"movie":"1287","rate":"5","timeStamp":"978302039","uid":"1"}

{"movie":"2804","rate":"5","timeStamp":"978300719","uid":"1"}

{"movie":"594","rate":"4","timeStamp":"978302268","uid":"1"}

现在需要将数据导入到 hive 仓库中,并且最终要得到这么一个结果:

该怎么做、???(提示:可用内置 get_json_object 或者自定义函数完成)

A. get_json_object(string json_string, string path)

返回值: string

说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。  这个函数每次只能返回一个数据项。

0: jdbc:hive2://hadoop3:10000> select get_json_object(‘{"movie":"594","rate":"4","timeStamp":"978302268","uid":"1"}‘,‘$.movie‘);

创建json表并将数据导入进去

0: jdbc:hive2://hadoop3:10000> create table json(data string);
No rows affected (0.983 seconds)
0: jdbc:hive2://hadoop3:10000> load data local inpath ‘/home/hadoop/json.txt‘ into table json;
No rows affected (1.046 seconds)
0: jdbc:hive2://hadoop3:10000> 

0: jdbc:hive2://hadoop3:10000> select 
. . . . . . . . . . . . . . .> get_json_object(data,‘$.movie‘) as movie 
. . . . . . . . . . . . . . .> from json;

B. json_tuple(jsonStr, k1, k2, ...)

参数为一组键k1,k2……和JSON字符串,返回值的元组。该方法比 get_json_object 高效,因为可以在一次调用中输入多个键

0: jdbc:hive2://hadoop3:10000> select 
. . . . . . . . . . . . . . .>   b.b_movie,
. . . . . . . . . . . . . . .>   b.b_rate,
. . . . . . . . . . . . . . .>   b.b_timeStamp,
. . . . . . . . . . . . . . .>   b.b_uid 
. . . . . . . . . . . . . . .> from json a
. . . . . . . . . . . . . . .> lateral view json_tuple(a.data,‘movie‘,‘rate‘,‘timeStamp‘,‘uid‘) b as b_movie,b_rate,b_timeStamp,b_uid;

(3) Transform实现

Hive 的 TRANSFORM 关键字提供了在 SQL 中调用自写脚本的功能。适合实现 Hive 中没有的 功能又不想写 UDF 的情况

具体以一个实例讲解。

Json 数据: {"movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"}

需求:把 timestamp 的值转换成日期编号

1、先加载 rating.json 文件到 hive 的一个原始表 rate_json

create table rate_json(line string) row format delimited;
load data local inpath ‘/home/hadoop/rating.json‘ into table rate_json;

2、创建 rate 这张表用来存储解析 json 出来的字段:

create table rate(movie int, rate int, unixtime int, userid int) row format delimited fields
terminated by ‘\t‘;

解析 json,得到结果之后存入 rate 表:

insert into table rate select
get_json_object(line,‘$.movie‘) as moive,
get_json_object(line,‘$.rate‘) as rate,
get_json_object(line,‘$.timeStamp‘) as unixtime,
get_json_object(line,‘$.uid‘) as userid
from rate_json;

3、使用 transform+python 的方式去转换 unixtime 为 weekday

先编辑一个 python 脚本文件

按 Ctrl+C 复制代码

按 Ctrl+C 复制代码

保存文件 然后,将文件加入 hive 的 classpath:

hive>add file /home/hadoop/weekday_mapper.py;
hive> insert into table lastjsontable select transform(movie,rate,unixtime,userid)
using ‘python weekday_mapper.py‘ as(movie,rate,weekday,userid) from rate;

创建最后的用来存储调用 python 脚本解析出来的数据的表:lastjsontable

create table lastjsontable(movie int, rate int, weekday int, userid int) row format delimited
fields terminated by ‘\t‘;

最后查询看数据是否正确

select distinct(weekday) from lastjsontable;

原文地址:https://www.cnblogs.com/dll102/p/12055776.html

时间: 2024-10-13 01:43:47

HIVE的高级操作的相关文章

Hive(三)hive的高级操作

一.hive的各种join操作 语法结构:join_table:table_reference JOIN table_factor [join_condition]| table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition| table_reference LEFT SEMI JOIN table_reference join_conditionHive 支持等值连接( equality join

Hive学习之路 (十)Hive的高级操作

一.负责数据类型 1.array 现有数据如下: 1 huangbo guangzhou,xianggang,shenzhen a1:30,a2:20,a3:100 beijing,112233,13522334455,5002 xuzheng xianggang b2:50,b3:40 tianjin,223344,13644556677,6003 wangbaoqiang beijing,zhejinag c1:200 chongqinjg,334455,15622334455,20 建表语

hive高级操作(优化,数据倾斜优化)

2019/2/21 星期四 hive高级操作(优化,数据倾斜优化) 分区表/桶表应用,skew,map-join //见hive的基本语法行列转换 hive 优化hive 优化思想Explain 的使用经典案例(distinct count) 数据倾斜的原因操作:关键词 情形 后果1.Join 其中一个表较小,但是key 集中分发到某一个或几个Reduce 上的数据远高于平均值 :2.大表与大表,但是分桶的判断字段0 值或空值过多这些空值都由一个reduce 处理,非常慢:3.group by

线程高级操作(二)

之前在线程高级操作中说到了线程的高级操作包括修改线程的属性和进行线程之间的同步操作.线程的同步有两种方式,一种是使用互斥量一种是使用读写锁.上一篇文章说的是互斥量,这篇文章主要介绍的是读写锁. 读写锁与互斥量类似,但是读写锁相对于互斥量来说最大的特点就是并行性高.互斥锁每次只有一个线程可以得到锁进行操作,其他的线程处于阻塞状态.多线程的意义就在于高并发性,但是使用互斥量就会将并行操作编程串行操作,程序的效率会大打折扣. 读写锁的优点是读写锁分为两种,读线程和写线程.读线程只对共享资源进行读操作,

数据库的高级操作

高级操作 复制表结构 语法: ????create table 表B like 表A; 示例: 复制表中的数据 语法: ????create table 表B select *或字段列表 from 表A; 蠕虫复制 语法: ????insert into 表名[(字段列表)] select *或字段列表 from 表名; 修改操作 ????限制修改指定的行数. 语法: ????update 表名 set 字段=值... [where子句] limit n; 说明: ????在执行update语句

Eclipse高级操作 远程调试

Eclipse高级操作 远程调试 JPDA是SUN JDK自带的远程调试机制.它提供了一套标准的调试接口,可以从虚拟机一级允许外界用特定协议探测虚拟机内部的运作细节.只要你装了JDK1.2以上的SUN JDK,就已经有了JPDA支持.只要是用标准SUN JDK中java.exe运行的应用,就可以用JPDA进行远程调试.以WEB应用的开发为例,servlet和ejb的调试一直不是一件太容易的事情.虽然Jbuilder/Eclipse等有一些常见的应用服务器,如tomcat/weblogic的调试插

Git高级操作

本文是在Git操作指南基础上衍生出来的高级操作,如果你对git不是很熟悉,建议你先阅读Git操作指南. 一.忽略提交特定文件 如果你不想让一些文件上传到git仓库中,可以让Git忽略特定文件或是目录,通过vi ~/.gitconfig编辑git的配置文件,可以使用感叹号(注意英文)来指出例外的情况. 1 !*.a //所有文件后缀为a的都不提交 2 !/demo/ //文件demo下的所有文件都不提交 二.查看仓库历史记录 git log 用来查看仓库历史记录,有三个参数: oneline——把

【转载】8天学通MongoDB——第三天 细说高级操作

今天跟大家分享一下mongodb中比较好玩的知识,主要包括:聚合,游标. 一: 聚合 常见的聚合操作跟sql server一样,有:count,distinct,group,mapReduce. <1> count count是最简单,最容易,也是最常用的聚合工具,它的使用跟我们C#里面的count使用简直一模一样. <2> distinct 这个操作相信大家也是非常熟悉的,指定了谁,谁就不能重复,直接上图. <3> group 在mongodb里面做group操作有点

sql高级操作

同样也是用于记录以便日后联系用!里面基本包含了一般sql的高级用法! drop table if exists stu; create table stu( name varchar(30), age int, stuid int not null PRIMARY key AUTO_INCREMENT, idnum int, sex varchar(30), check(sex in ('男','女')) )charset=utf8; insert into stu (name,age,idnu